【问题标题】:Filter base on multiple conditions and variables基于多个条件和变量的过滤器
【发布时间】:2019-10-12 19:42:13
【问题描述】:

我正在处理调查数据,我需要通过一堆多个响应变量进行过滤,准确地说是 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)

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

【问题讨论】:

  • 我不清楚你所说的“有多少人至少回答了其中一个问题”是什么意思,因为这些是多个回答,你的意思是他们只给出了一个回答(回答的总和是 1)或他们至少给出了一个响应(响应的总和 >= 1)
  • 另外请显示此示例数据的预期结果。
  • 向每个向量添加第 5 个元素是否有意义,对于所有这些向量都是 0?否则你怎么知道代码是否有效。
  • @akrun 是的,a,b,c,d,e 我的意思是 Q1,...,Q5。我已经改了
  • @Elin 数据来自一项调查,其中人们将某些特征与几家公司联系起来。被调查者只回答了他们知道的那些公司(用之前的问题衡量),所以有些行只有零

标签: r filter dplyr


【解决方案1】:

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

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

或者使用mapreduce。我们用map 循环遍历selected 列,创建一个逻辑vectorreduce 到一个逻辑vector|。这可以在filter 中使用来过滤行

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

或者另一种方式是rowSums

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

【讨论】:

    【解决方案2】:

    基础R一班轮:

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

    【讨论】:

      猜你喜欢
      • 2016-12-10
      • 2010-10-22
      • 2022-07-21
      • 2021-12-14
      • 1970-01-01
      • 2019-03-21
      • 2019-10-28
      • 2019-09-10
      • 2020-10-10
      相关资源
      最近更新 更多