R 筛选多个列上具有相同条件的行

R 筛选多个列上具有相同条件的行,r,dplyr,R,Dplyr,我想在不同的列中使用相同的条件选择基于行的行 set.seed(123) df <- data.frame(col.x = sample(LETTERS[1:10], 20, replace = TRUE), col.y = sample(LETTERS[1:10], 20, replace = TRUE), val = rnorm(20)) 我尝试过这两种方法,它们给出了相同的预期结果 df %>% filt

我想在不同的列中使用相同的条件选择基于行的行

set.seed(123)
df <- data.frame(col.x = sample(LETTERS[1:10], 20, replace = TRUE), 
                 col.y = sample(LETTERS[1:10], 20, replace = TRUE), 
                 val = rnorm(20))
我尝试过这两种方法,它们给出了相同的预期结果

df %>% filter(col.x %in% ValsToRetain) %>% filter(col.y %in% ValsToRetain)
df %>% filter(col.x %in% ValsToRetain & col.y %in% ValsToRetain)
#   col.x col.y        val
# 1     A     H -1.6866933
# 2     F     F  0.8377870
# 3     J     J  0.4264642
# 4     F     H  0.8781335
# 5     D     D -0.3059627
但是,还有其他优雅的方式吗


比如,;类似于跨这些列计算
rowSums
,以检查它是否有
na
s。由于有多个值,我无法得到类似的想法,如
行和(df[,1:2]=“a”)

我们可以使用
filter\u at
all\u vars

df %>% 
  filter_at(vars(starts_with("col")), all_vars(. %in% ValsToRetain))
#   col.x col.y        val
#1     A     H -1.6866933
#2     F     F  0.8377870
#3     J     J  0.4264642
#4     F     H  0.8781335
#5     D     D -0.3059627

您可以使用子集,它很短,但与您的方法相同:

filt <- subset(df,col.x %in% ValsToRetain & col.y %in% ValsToRetain)

下面是一个使用
Reduce
lappy
的基本R方法。
lappy
%应用于%
相关列,返回逻辑向量列表。然后
Reduce
使用
将这些向量组合成一个向量

df[Reduce("&", lapply(df[c("col.x", "col.y")], "%in%", ValsToRetain)),]
   col.x col.y        val
6      A     H -1.6866933
7      F     F  0.8377870
11     J     J  0.4264642
14     F     H  0.8781335
19     D     D -0.3059627

如果您有许多列用于比较,那么您可以使用
grep
来选择它们,比如
grep(“^col”,names(df))
来代替
c(“col.x”,“col.y”)

这与OP的第二个选项df%>%filter(col.x%在%ValsToRetain中,col.y%在%ValsToRetain中)完全相同-你只是使用了
子集
而不是
过滤器
@Sotos,这正是我说的“与你的方法相同”,所以你不必投反对票。我猜,我觉得在这里投反对票是合理的,因为OP寻求任何其他优雅的方式来做到这一点。。。我的意思是你可以用一些不同的东西来更新你的答案,至少给你的答案一些价值,我会很高兴推翻我的投票。例如,
df%>%mutate_at(vars(-val)、funs((replace(,!.%in%ValsToRetain,NA)))%>%NA.omit()
应该与我提到的完全相同,感谢您提醒baseR函数!谢谢,这绝对是一种优雅的方式。如果列名称为
xvar
yvar
valvar
,您是否看到其他方法?它是否在(变量('xvar','yvar')、所有变量(.%in%ValsToRetain))
处进行过滤??顺便问一下,您使用的是哪个版本的
dplyr
?我收到一个错误
在“
中找不到函数“filter\u”。您可以使用变量的否定版本,即
df%>%filter\u在(变量(-val)、所有变量(.%in%ValsToRetain))
 col.x col.y        val
     A     H -1.6866933
     F     F  0.8377870
     J     J  0.4264642
     F     H  0.8781335
     D     D -0.3059627
df[Reduce("&", lapply(df[c("col.x", "col.y")], "%in%", ValsToRetain)),]
   col.x col.y        val
6      A     H -1.6866933
7      F     F  0.8377870
11     J     J  0.4264642
14     F     H  0.8781335
19     D     D -0.3059627