dplyr
中的条件变异是"简单" (种类)使用if_else()
:
can dplyr package be used for conditional mutating?
但是,假设我想同时mutate
列x,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
(如果可能)获得相同的结果?
答案 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))))