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