dplyr从any_vars()过滤条件创建新的布尔变量

时间:2019-08-15 16:17:34

标签: r dplyr

我想基于多个变量的条件创建一个布尔变量。如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()似乎不是正确的选择。

1 个答案:

答案 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