我想基于多个变量的条件创建一个布尔变量。如this question的第二个答案所示,一个人可以根据许多列中的许多条件进行过滤:
mtcars %>% filter_at(vars(starts_with("d"),starts_with("c")), any_vars(. %in% c(4)))
我想做类似的事情
test <- mtcars %>% mutate(has.4 = any_vars(vars(starts_with("d"),starts_with("c")) %in% c(4)))
但是这当然不起作用,并且给出Error: Column ``has.4`` is of unsupported type quoted call
。
filter_at()
调用已经在创建布尔值,并以此为数据的子集。如何将输出通过管道传递到新变量中,并保留所有行?
此外,我只想创建一个新列,因此mutate_at()
和mutate_if()
似乎不是正确的选择。
答案 0 :(得分:1)
这里的选项是starts_with
而不是matches
library(dplyr)
out1 <- mtcars %>%
filter_at(vars(matches('^(d|c)')), any_vars(. %in% 4))
如果需要一列,可以使用rowSums
out2 <- mtcars %>%
mutate(has.4 = rowSums(select(., matches("^(d|c)")) == 4) > 0)
identical(out1, out2 %>%
filter(has.4) %>%
select(-has.4))
#[1] TRUE