通过使用dplyr测试跨多个列的逻辑条件进行筛选

时间:2018-05-24 06:01:26

标签: r dplyr

dplyr中是否有一个函数允许您针对选择的列测试相同的条件?

采用以下数据框:

Demo1 <- c(8,9,10,11)
Demo2 <- c(13,14,15,16)
Condition <- c('A', 'A', 'B', 'B')
Var1 <- c(13,76,105,64)
Var2 <- c(12,101,23,23)
Var3 <- c(5,5,5,5)

df <- as.data.frame(cbind(Demo1, Demo2, Condition, Var1, Var2, Var3), stringsAsFactors = F)
df[4:6] <- lapply(df[4:6], as.numeric)

我想在Var1,Var2或Var3中的任何一行中获取至少有一个值大于100的行。我意识到我可以通过一系列或语句来做到这一点,如下所示:

df <- df %>% 
  filter(Var1 > 100 | Var2 > 100 | Var3 > 100)

但是,由于我的实际数据集中有很多列,这将非常耗时。我假设有一些相当简单的方法可以做到这一点,但我们无法在SO上找到解决方案。

2 个答案:

答案 0 :(得分:2)

我们可以使用filter_atany_vars

执行此操作
df %>% 
  filter_at(vars(matches("^Var")), any_vars(.> 100))
#   Demo1 Demo2 Condition Var1 Var2 Var3
#1     9    14         A   76  101    5
#2    10    15         B  105   23    5

或使用base R,创建一个包含lapplyReduce的逻辑表达式并对行进行子集

df[Reduce(`|`, lapply(df[grepl("^Var", names(df))], `>`, 100)),]

答案 1 :(得分:2)

base-R中,可以使用rowSums编写相同的过滤器:

df[rowSums((df[,grepl("^Var",names(df))] > 100)) >= 1, ]

#   Demo1 Demo2 Condition Var1 Var2 Var3
# 2     9    14         A   76  101    5
# 3    10    15         B  105   23    5