使用dplyr同时针对多个列进行条件变异

时间:2018-06-17 13:21:33

标签: r dplyr mutate

dplyr中的条件变异是"简单" (种类)使用if_else()

can dplyr package be used for conditional mutating?

但是,假设我想同时mutatex,y,z,基于依赖于列group的逻辑条件C:mutat离子仅当C为TRUE时才会发生,否则x,y,z保持不变。我怎样才能做到这一点?在基数R中,它很简单:

n <- 5 
k <- 10
my_labels <- LETTERS[1:5]

foobar <- data.frame(group = gl(n, k, labels = my_labels), x = runif(n*k), y=rnorm(n*k), z = rpois(n*k, 1), month_name = (rep(month.name[1:k], n)))

# mutate x, y, z, only if the condition on group is TRUE
foobar[foobar$group %in% c("B","E"), c("x", "y", "z")] <- NA

如何使用dplyr(如果可能)获得相同的结果?

2 个答案:

答案 0 :(得分:3)

我们可以在replace

中使用mutate_at
library(dplyr)
foobar %>% 
   mutate_at(vars(x, y, z),
       funs(replace(., group %in% c("B", "E"), NA)))

如果我们想使用if_else

foobar %>% 
  mutate_at(vars(x, y, z),
      funs(if_else(group %in% c("B", "E"), NA_real_, as.numeric(.))))

答案 1 :(得分:1)

使用从 dplyr 1.0.0 开始可用的 dplyr::across,您可以:

foobar %>% 
  mutate(across(c(x, y, z), 
         ~ if_else(group %in% c("B", "E"), NA_real_, as.numeric(.x))))