在多个列上过滤具有相同条件的行

时间:2017-08-25 07:48:19

标签: 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))

我需要ValsToRetain中的两列col.xcol.y中只有{。}}。

ValsToRetain <- c('A','D', 'F','H','J')

我尝试过这两种给出相同预期输出的方法。

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个。由于有多个值,我无法得到像rowSums(df[,1:2] == 'A')这样的类似想法。

3 个答案:

答案 0 :(得分:3)

我们可以将filter_atall_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

答案 1 :(得分:1)

以下是使用Reducelapply的基本R方法。 lapply在相关列中应用%in%,返回逻辑向量列表。然后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")

答案 2 :(得分:-1)

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

filt <- subset(df,col.x %in% ValsToRetain & col.y %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