我有一個 for 回圈我試圖轉換為一個 mapply,因為我已經讀到它比 for 更快(for 回圈大約需要 2 分鐘)。
回圈執行此操作:它創建按列“OrdenFab”的唯一名稱過濾的子集,然后將未重復的值保留在“Valor”列上。然后,它將這個過濾后的子集添加到一個新的資料幀中,并隨著回圈的繼續將它們全部添加,得到一個過濾后的資料幀,在“OrdenFab”列的每個唯一值的“Valor”列中沒有重復值。
i<-unique(datapesomolde$OrdenFab)
datapesomoldefiltered<-data.frame()
for (j in i){
datapesomoldetemp<-datapesomolde%>%
filter(OrdenFab==j)%>%
filter(!duplicated(Valor))
datapesomoldefiltered<-rbind(datapesomoldefiltered,datapesomoldetemp)
}
原始資料框是這個(前 20 行,它有 20626):
> datapesomolde
PartNumber OrdenFab Valor Fecha_Registro LimInf LimSup Nominal
1 11012501 226549204 14.50000 2022-04-25 07:18:00 12.65 14.71 13.68
2 11012501 226549204 14.50000 2022-04-25 07:18:00 12.65 14.71 13.68
3 11013610 226548648 47.30000 2022-04-25 05:52:00 42.38 49.26 45.82
4 11013047 226548234 15.20000 2022-04-23 02:47:00 14.43 16.77 15.60
5 11013047 226548234 15.20000 2022-04-23 02:47:00 14.43 16.77 15.60
6 11013047 226548234 15.20000 2022-04-23 02:48:00 14.43 16.77 15.60
7 11013047 226548234 15.20000 2022-04-23 02:48:00 14.43 16.77 15.60
8 11013052 226548332 16.30000 2022-04-23 01:49:00 15.63 18.17 16.90
9 11013052 226548332 16.30000 2022-04-23 01:49:00 15.63 18.17 16.90
10 11013052 226548332 16.30000 2022-04-23 01:49:00 15.63 18.17 16.90
11 11013052 226548332 16.30000 2022-04-23 01:49:00 15.63 18.17 16.90
12 11012501 226548204 14.70000 2022-04-23 01:44:00 12.65 14.71 13.68
13 11012501 226548204 14.70000 2022-04-23 01:44:00 12.65 14.71 13.68
14 11012501 226548200 14.55000 2022-04-23 01:43:00 12.65 14.71 13.68
15 11012501 226548200 14.55000 2022-04-23 01:43:00 12.65 14.71 13.68
16 11012501 226548201 14.65000 2022-04-23 01:42:00 12.65 14.71 13.68
17 11012501 226548201 14.65000 2022-04-23 01:42:00 12.65 14.71 13.68
18 11013943 226548154 134.00000 2022-04-23 00:07:00 131.76 153.13 142.44
19 11013943 226547066 144.00000 2022-04-22 23:31:00 131.76 153.13 142.44
20 11013050 226547200 15.10000 2022-04-22 23:27:00 14.34 16.66 15.50
過濾結果是這個(前 10 行):
>datapesomoldefiltered
PartNumber OrdenFab Valor Fecha_Registro LimInf LimSup Nominal
1 11012501 226549204 14.50000 2022-04-25 07:18:00 12.65 14.71 13.68
2 11013610 226548648 47.30000 2022-04-25 05:52:00 42.38 49.26 45.82
3 11013047 226548234 15.20000 2022-04-23 02:47:00 14.43 16.77 15.60
4 11013052 226548332 16.30000 2022-04-23 01:49:00 15.63 18.17 16.90
5 11012501 226548204 14.70000 2022-04-23 01:44:00 12.65 14.71 13.68
6 11012501 226548200 14.55000 2022-04-23 01:43:00 12.65 14.71 13.68
7 11012501 226548201 14.65000 2022-04-23 01:42:00 12.65 14.71 13.68
8 11013943 226548154 134.00000 2022-04-23 00:07:00 131.76 153.13 142.44
9 11013943 226547066 144.00000 2022-04-22 23:31:00 131.76 153.13 142.44
10 11013050 226547200 15.10000 2022-04-22 23:27:00 14.34 16.66 15.50
我正在努力將其轉換為 mapply,我得到的是一個矩陣而不是一個資料框。我試過這個:
i<-unique(datapesomolde$OrdenFab)
datapesomoldefiltered<-data.frame()
limpiarof<-function(i){
subset<-filter(datapesomolde,OrdenFab==i)
datapesomoldetemp<-filter(subset,!duplicated(subset$Valor))
return(datapesomoldefiltered<-rbind(datapesomoldefiltered,datapesomoldetemp))
}
datapesomoldefiltered<-mapply(limpiarof,i)
通過這次嘗試,我得到了一個 2.2GB 的矩陣,它只有“OrdenFab”列的每個唯一值的所有列的值。
映射的結果
你能幫我嗎?提前致謝。
uj5u.com熱心網友回復:
我建議使用更抽象的方法來解決這個問題,例如tidyverse:
這應該更快更清晰:
library(tidyverse)
datapesomoldefiltered <-
datapesomolde |>
group_by(OrdenFab) |>
distinct(Valor, .keep_all = TRUE) |>
ungroup()
datapesomoldefiltered
uj5u.com熱心網友回復:
這里有兩種方法。不同之處在于,在第一個解決方案中,原始行順序保留在最終結果中。如果這無關緊要,第二個解決方案會跳過創建臨時串列sp。
x <- " PartNumber OrdenFab Valor Fecha_Registro LimInf LimSup Nominal
1 11012501 226549204 14.50000 '2022-04-25 07:18:00' 12.65 14.71 13.68
2 11012501 226549204 14.50000 '2022-04-25 07:18:00' 12.65 14.71 13.68
3 11013610 226548648 47.30000 '2022-04-25 05:52:00' 42.38 49.26 45.82
4 11013047 226548234 15.20000 '2022-04-23 02:47:00' 14.43 16.77 15.60
5 11013047 226548234 15.20000 '2022-04-23 02:47:00' 14.43 16.77 15.60
6 11013047 226548234 15.20000 '2022-04-23 02:48:00' 14.43 16.77 15.60
7 11013047 226548234 15.20000 '2022-04-23 02:48:00' 14.43 16.77 15.60
8 11013052 226548332 16.30000 '2022-04-23 01:49:00' 15.63 18.17 16.90
9 11013052 226548332 16.30000 '2022-04-23 01:49:00' 15.63 18.17 16.90
10 11013052 226548332 16.30000 '2022-04-23 01:49:00' 15.63 18.17 16.90
11 11013052 226548332 16.30000 '2022-04-23 01:49:00' 15.63 18.17 16.90
12 11012501 226548204 14.70000 '2022-04-23 01:44:00' 12.65 14.71 13.68
13 11012501 226548204 14.70000 '2022-04-23 01:44:00' 12.65 14.71 13.68
14 11012501 226548200 14.55000 '2022-04-23 01:43:00' 12.65 14.71 13.68
15 11012501 226548200 14.55000 '2022-04-23 01:43:00' 12.65 14.71 13.68
16 11012501 226548201 14.65000 '2022-04-23 01:42:00' 12.65 14.71 13.68
17 11012501 226548201 14.65000 '2022-04-23 01:42:00' 12.65 14.71 13.68
18 11013943 226548154 134.00000 '2022-04-23 00:07:00' 131.76 153.13 142.44
19 11013943 226547066 144.00000 '2022-04-22 23:31:00' 131.76 153.13 142.44
20 11013050 226547200 15.10000 '2022-04-22 23:27:00' 14.34 16.66 15.50"
datapesomolde <- read.table(textConnection(x), header = TRUE)
suppressPackageStartupMessages({
library(dplyr)
library(purrr)
})
datapesomolde$Fecha_Registro <- as.POSIXct(datapesomolde$Fecha_Registro)
sp <- split(datapesomolde, datapesomolde$OrdenFab)
sp %>%
map_dfr( ~ .x %>% filter(!duplicated(Valor))) %>%
arrange(as.integer(row.names(.)))
#> PartNumber OrdenFab Valor Fecha_Registro LimInf LimSup Nominal
#> 1 11012501 226549204 14.50 2022-04-25 07:18:00 12.65 14.71 13.68
#> 3 11013610 226548648 47.30 2022-04-25 05:52:00 42.38 49.26 45.82
#> 4 11013047 226548234 15.20 2022-04-23 02:47:00 14.43 16.77 15.60
#> 8 11013052 226548332 16.30 2022-04-23 01:49:00 15.63 18.17 16.90
#> 12 11012501 226548204 14.70 2022-04-23 01:44:00 12.65 14.71 13.68
#> 14 11012501 226548200 14.55 2022-04-23 01:43:00 12.65 14.71 13.68
#> 16 11012501 226548201 14.65 2022-04-23 01:42:00 12.65 14.71 13.68
#> 18 11013943 226548154 134.00 2022-04-23 00:07:00 131.76 153.13 142.44
#> 19 11013943 226547066 144.00 2022-04-22 23:31:00 131.76 153.13 142.44
#> 20 11013050 226547200 15.10 2022-04-22 23:27:00 14.34 16.66 15.50
rm(sp) # tidy up
由reprex 包于 2022-06-01 創建(v2.0.1)
datapesomolde %>%
group_split(OrdenFab) %>%
map_dfr( ~ .x %>% filter(!duplicated(Valor)))
#> # A tibble: 10 × 7
#> PartNumber OrdenFab Valor Fecha_Registro LimInf LimSup Nominal
#> <int> <int> <dbl> <dttm> <dbl> <dbl> <dbl>
#> 1 11013943 226547066 144 2022-04-22 23:31:00 132. 153. 142.
#> 2 11013050 226547200 15.1 2022-04-22 23:27:00 14.3 16.7 15.5
#> 3 11013943 226548154 134 2022-04-23 00:07:00 132. 153. 142.
#> 4 11012501 226548200 14.6 2022-04-23 01:43:00 12.6 14.7 13.7
#> 5 11012501 226548201 14.6 2022-04-23 01:42:00 12.6 14.7 13.7
#> 6 11012501 226548204 14.7 2022-04-23 01:44:00 12.6 14.7 13.7
#> 7 11013047 226548234 15.2 2022-04-23 02:47:00 14.4 16.8 15.6
#> 8 11013052 226548332 16.3 2022-04-23 01:49:00 15.6 18.2 16.9
#> 9 11013610 226548648 47.3 2022-04-25 05:52:00 42.4 49.3 45.8
#> 10 11012501 226549204 14.5 2022-04-25 07:18:00 12.6 14.7 13.7
由reprex 包于 2022-06-01 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/484947.html
