多列R dplyr过滤器字符串条件

时间:2020-08-29 03:14:09

标签: r tidyverse

我有一个df,例如

df <-read.table(text="
v1 v2 v3 v4 v5
1  A  B  X  C
2  A  B  C  X
3  A  C  C  C
4  B  D  V  A
5  B  Z  Z  D", header=T)

如何将变量v2过滤到v5(如果变量中带有“ X”)。我已经看到了一些使用filter的示例,但它们似乎仅适用于数字条件。

filter_at(vars(contains("prefix")), all_vars(.>5))

将“ X”替换为> 5无效

2 个答案:

答案 0 :(得分:2)

使用 dplyr 1.0.4,我们可以使用 if_any

library(dplyr)
df %>%
    filter(if_any(v2:v5, ~ . == 'X'))
#   v1 v2 v3 v4 v5
#1  1  A  B  X  C
#2  2  A  B  C  X

答案 1 :(得分:1)

您可以将filter_atany_vars一起使用,以选择至少具有一个值"X"的行。

library(dplyr)
df %>% filter_at(vars(v2:v5), any_vars(. == 'X'))

#  v1 v2 v3 v4 v5
#1  1  A  B  X  C
#2  2  A  B  C  X

但是,filter_at已被替换为超级种子,因此您可以将其翻译为across

df %>% filter(Reduce(`|`, across(v2:v5, ~. == 'X')))

在基数R中也更容易:

df[rowSums(df[-1] == 'X') > 0, ]