我想使用一個管道作業流程,在一個有10^4s行的資料集上定期應用dplyr::case_when,并希望避免使用rowwise,因為它很慢。
我想將大量的標準與給定的值相匹配,例如:any(x = c(1:999, 3000:200000, 250000:250100),其中length(x)為1,并將其應用于data.frame中的每一行。
類似于這個函式的東西,但有更多的標準:
。is_good_car < - function(x){
any()
x == c()
"Mazda RX4",
"Datsun 710",
"Valiant">
)
)
}。
我可以這樣應用它:
library(dplyr)
mtcars%>%
mutate()
car = rownames(.)。
) %>%
as_tibble%>%
mutate()
good_cars = case_when()
is_good_car(car) ~ "good",
TRUE ~ "rubbish"
)
) %>%
select(car, good_cars)
#> Warning in x == c("Mazda RX4", "Datsun 710", "Valiant"): long object length is
#> 不是短物件長度的倍數。
#> # A tibble: 32 x 2。
#> car good_cars
#> <chr> <chr>
#> 1 馬自達RX4好
#> 2 Mazda RX4 Wag good
#> 3 Datsun 710 good
#> 4 Hornet 4 Drive good
#> 5 Hornet Sportabout good
#> 6 Valiant good
#> 7 Duster 360 good
#> 8 Merc 240D good
#> 9 Merc 230 good
#> 10 Merc 280 良好
#> # ...還有22行。
但是這不起作用,因為它只是從is_good_car回傳一個單一的TRUE,并將此回傳給每一行。
我可以使用rowwise來獲得正確的答案,但是對于我的目的來說,它很慢:
mtcars %>%
mutate()
car = rownames(.)。
) %>%
as_tibble%>%
rowwise%>%
mutate()
good_cars = case_when()
is_good_car(car) ~ "good",
TRUE ~ "rubbish"
)
) %>%
select(car, good_cars)
#> # A tibble: 32 x 2
#> #排行。
#> car good_cars
#> <chr> <chr>
#> 1 馬自達RX4 好
#> 2 馬自達RX4 Wag rubbish
#> 3 Datsun 710 good
#> 4 Hornet 4 Drive rubbish
#> 5 Hornet Sportabout rubbish
#> 6 Valiant good
#> 7 Duster 360 rubbish
#> 8 Merc 240D rubbish
#> 9 Merc 230 rubbish
#> 10 Merc 280 rubbish
#> # ......還有22行。
我也可以使用sapply,但我想把它納入一個像上面那樣的管道作業流程:
sapply()
X = rownames(mtcars),
FUN = is_good_car
)
#> Mazda RX4 Mazda RX4 Wag Datsun 710 Hornet 4 Drive
#> TRUE FALSE TRUE FALSE
#> Hornet Sportabout Valiant Duster 360 Merc 240D
#> FALSE TRUE FALSE FALSE
#> Merc 230 Merc 280 Merc 280C Merc 450SE
#> FALSE FALSE FALSE FALSE
#> Merc 450SL Merc 450SLC Cadillac Fleetwood Lincoln Continental
#> FALSE FALSE FALSE
#> Chrysler Imperial Fiat 128 Honda Civic Toyota Corolla
#> FALSE FALSE FALSE
#> Toyota Corona Dodge Challenger AMC Javelin Camaro Z28
#> FALSE FALSE FALSE
#> Pontiac Firebird Fiat X1-9 Porsche 914-2 Lotus Europa
#> FALSE FALSE FALSE
#> Ford Pantera L Ferrari Dino Maserati Bora Volvo 142E
#> FALSE FALSE FALSE FALSE
在case_when中,是否有任何選項可以根據需要使用像is_good_car這樣的函式而不使用rowwise?
創建于2021-09-22,由reprex包(v2.0.1)
uj5u.com熱心網友回復:
對于比較多個值,你應該使用%in%。
is_good_car < - function(x){
x %in% c()
"Mazda RX4",
"Datsun 710",
"Valiant">
)
}
那么你就可以不用rowwise來使用它 -
library(dplyr)
mtcars%>%
mutate()
car = rownames(.)。
) %>%
as_tibble%>%
mutate()
good_cars = case_when( is_good_car(car) ~ "good"。
TRUE ~ "rubbish"
)
) %>%
select(car, good_cars)
# car good_cars
# <chr> <chr>
# 1 馬自達RX4 好
# 2 Mazda RX4 Wag rubbish
#3 Datsun 710 good
# 4 大黃蜂4驅動器垃圾 # 4 大黃蜂4驅動器垃圾#5 Hornet Sportabout rubbish
#6 Valiant good
#7 Duster 360 rubbish
#8 Merc 240D rubbish
# 9 Merc 230 rubbish # 9 Merc 230 rubbish #10 Merc 280 rubbish #10 Merc 280 rubbish # ......還有22行。
uj5u.com熱心網友回復:
如果你把==改為%in%,像這樣:
is_good_car < - function(x){
any()
x %in% c()
"Mazda RX4",
"Datsun 710",
"Valiant">
)
)
}。
該函式現在被矢量化了,將變得很快速,不需要rowwise。
uj5u.com熱心網友回復:
我們可以使用map,它應該比rowwise更快
library(purrr)
library(tibble)
library(dplyr)
mtcars %>%。
rownames_to_column('car') %>;%
mutate(good_cars =case_when(map_lgl(car, is_good_car) ~
'good'/span>。 TRUE ~ 'rubbish')) %> %
as_tibble
輸出
# A tibble: 32 x 13
汽車 mpg cyl disp hp drat wt qsec vs am gear carb good_cars
<chr> <dbl> <dbl> < dbl> <dbl> <dbl> < dbl> <dbl> <dbl>/span> <dbl> <dbl> < dbl>/span> <chr>/span>
1 馬自達RX4 21 6 160 110 3。 9 2.62 16. 5 0 1 4 4 good
2 馬自達RX4 Wag 21 6 160 110 3。 9 2.88 17. 0 0 1 4 4 垃圾
3 Datsun 710 22。 8 4 108 93 3。 85 2.32 18. 6 1 1 4 1 good
4 大黃蜂 4 驅動 21. 4 6 258 110 3。 08 3.22 19. 4 1 0 3 1 rubbish
5 Hornet Sportabout 18.7 8 360 175 3。 15 3.44 17. 0 0 0 3 2 rubbish
6 Valiant 18.1 6 225 105 2。 76 3.46 20. 2 1 0 3 1 good
7 Duster 360 14. 3 8 360 245 3。 21 3.57 15. 8 0 0 3 4 rubbish
8 Merc 240D 24。 4 4 147. 62 3。 69 3. 19 20 1 0 4 2 rubbish
9 Merc 230 22。 8 4 141. 95 3. 92 3.15 22. 9 1 0 4 2 rubbish
10 Merc 280 19. 2 6 168. 123 3. 92 3.44 18. 3 1 0 4 4 垃圾
# ......還有22行
或者另一個選擇是使用
%in%,沒有任何case_when,它可以被改變
is_good_car < - function(x){
x %in% c()
"Mazda RX4",
"Datsun 710",
"Valiant">
)
}
-測驗
mtcars %>%
rownames_to_column('car') %>;%
mutate(good_cars = c("rubbish"。 "good")[1 is_good_car(car)] )
輸出
car mpg cyl disp hp drat wt qsec vs am gear carb good_cars
1 馬自達RX4 21.0 6 160.0 110 3。 90 2.620 16. 46 0 1 4 4 good
2 馬自達RX4 Wag 21.0 6 160.0 110 3。 90 2.875 17. 02 0 1 4 4 垃圾
3 Datsun 710 22。 8 4 108.0 93 3。 85 2.320 18. 61 1 1 4 1 good
4 大黃蜂 4 驅動 21. 4 6 258.0 110 3。 08 3.215 19. 44 1 0 3 1 rubbish
5 Hornet Sportabout 18.7 8 360.0 175 3。 15 3.440 17. 02 0 0 3 2 rubbish
6 Valiant 18.1 6 225.0 105 2。 76 3.460 20. 22 1 0 3 1 good
7 Duster 360 14. 3 8 360.0 245 3。 21 3.570 15. 84 0 0 3 4 rubbish
....
另外,如果我們需要更快的方法,可以使用data.table
library(data.table)
mtcars1 <- copy(mtcars)
setDT(mtcars, keep. rownames = TRUE)[, Good_cars : = 'rubbish'
][/span>rn %chin% c( "Mazda RX4"。
"Datsun 710",
"Valiant"), Good_cars : = 'good'][/span>]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/332206.html
標籤:
