根据多个条件和变量进行过滤

时间:2019-10-12 19:42:13

标签: r filter dplyr

我正在使用调查数据,我需要按一堆多个响应变量进行过滤,准确地说是543个变量。

像这样作为我的数据:

Q1 <- c(1,0,1,1)
Q2 <- c(0,1,0,0)
Q3 <- c(1,1,1,0)
Q4 <- c(0,0,0,0)
Q5 <- c(1,0,0,0)
DT <- data.frame(Q1,Q2,Q3,Q4,Q5)

我想知道有多少人至少回答了这个问题之一,因此使用dplyr软件包的代码应为:

MR <- DT %>%
   filter(Q1 == 1 | Q2 == 1 | Q3 == 1 | Q4 == 1 | Q5 == 1 )

nrow(MR)

基本上,我试图避免从变量1到变量543编写大量代码;像这样:

library(dplyr)
MR <- DT %>%
   filter(Q1 == 1 | Q2 == 1 | Q3 == 1 | Q4 == 1 | Q5 == 1 | ... | Q543 == 1)

是否有更有效的方法来过滤这么多变量?

2 个答案:

答案 0 :(得分:3)

有多种方法可以做到这一点。一个选项是filter_at,其中我们用select_helpersmatches-以(Q {)开头(^)的列名之一指定要选择的变量直到字符串的末尾(\\d+为止的一个或多个数字($),然后使用any_vars创建逻辑,它将具有至少一个值的行保留在列中等于1

library(dplyr)
DT %>%
   filter_at(vars(matches("^Q\\d+$")), any_vars(.==1))

或使用mapreduce。我们使用select遍历map ed列,创建一个逻辑vector,然后将reduce转换成一个带有vector的逻辑|。可以在filter中使用它来过滤行

library(purrr)
DT %>%
   filter(map(select(., matches("^Q\\d+$")), `==`, 1) %>% 
             reduce(`|`))

或者另一种方式是rowSums

DT %>%
   filter(rowSums(select(., matches("^Q\\d+$")) ==1) > 0)

答案 1 :(得分:1)

R基地一号班轮:

DT[c(sort(unique(unlist(lapply(DT, function(x){which(x==1)}))))),]