我有一个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无效
答案 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_at
与any_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, ]