簡體   English   中英

如何加速 case_when/條件變異?

[英]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 執行最少數量的評估嗎?

我對filterjoin的組合很糾結,但是,例如,這對tidygraph不起作用,因為通過過濾nodes ,也會過濾掉edges ,所以local_members將不再正常工作。

編輯:

另外,根據我的經驗, base::ifelse似乎比dplyr::case_when快; 這是預期的嗎?

dplyr::if_elsebase::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM