[英]How to speed up case_when/conditional mutate?
可以注意到case_when
在滿足條件時不在公式中評估 tibble 的子集,而是整個 tibble,例如:
picks = c(1:3)
a = tibble(id = c(1:4),
k = NA)
a %>% mutate(
k = case_when(id %in% picks~runif(length(picks)))
)
這在錯誤中很清楚:
Error: Problem with `mutate()` column `k`. i `k = case_when(id %in% picks ~ runif(length(picks)))`. x `id %in% picks ~ runif(length(picks))` must be length 4 or one, not 3.
另一種方法是rowwise()
或group_by(id)
但這仍然是非常低效的。 我可能仍會為rowwise()
路由,但由於我只需要對 1% 的 tibble 執行操作,所以我只希望在這 1% 內進行突變,其他任何東西都保持不變。 有什么建議讓 R 執行最少數量的評估嗎?
我對filter
和join
的組合很糾結,但是,例如,這對tidygraph
不起作用,因為通過過濾nodes
,也會過濾掉edges
,所以local_members
將不再正常工作。
編輯:
另外,根據我的經驗, base::ifelse
似乎比dplyr::case_when
快; 這是預期的嗎?
dplyr::if_else
比base::ifelse
快。 在 case_when 中,您還需要T ~ NA_real_
case_when
n()
:
picks = c(1:3)
a = tibble(id = c(1:4),
k = NA)
a %>% mutate(
k = case_when(
id %in% picks~runif(n()),
T ~ NA_real_
)
)
# A tibble: 4 x 2
id k
<int> <dbl>
1 1 0.0757
2 2 0.708
3 3 0.255
4 4 NA
# Would be faster with if_else:
a %>% mutate(
k = if_else(id %in% picks,
runif(n()),
NA_real_
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.