我正在使用调查数据,我需要按一堆多个响应变量进行过滤,准确地说是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)
是否有更有效的方法来过滤这么多变量?
答案 0 :(得分:3)
有多种方法可以做到这一点。一个选项是filter_at
,其中我们用select_helpers
(matches
-以(Q {)开头(^
)的列名之一指定要选择的变量直到字符串的末尾(\\d+
为止的一个或多个数字($
),然后使用any_vars
创建逻辑,它将具有至少一个值的行保留在列中等于1
library(dplyr)
DT %>%
filter_at(vars(matches("^Q\\d+$")), any_vars(.==1))
或使用map
和reduce
。我们使用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)}))))),]