【问题标题】:select rows based on multiple criteria in R根据 R 中的多个条件选择行
【发布时间】:2021-09-01 13:01:46
【问题描述】:

我有一个类似于以下的庞大数据集:

Df <- data.frame("Candidate ID"   = c(1042,  1042, 1113, 1113, 1146, 1277, 1381, 1381, 1402, 1402),
                 "Application ID" = c(1040, 13006, 1111, 1125, 1144, 1274,   41,   61,   64,   65),
                  "Question"     = c("Yes", "Yes", "No","Yes", "Yes","No", "No", "No","Yes", "No"))

背景:候选人可以申请多个职位申请,并且每次都会收到不同的申请 ID。一个应聘者 ID 最多可以申请 25 个工作申请,即申请 25 次不同的时间。在我的简化示例中,最大值是两个。

我想提取所有问题的答案都是“是”的候选人 ID。 在示例中,我想仅提取候选 ID 1042 和 1146。如何在 R 中执行此操作?

我在 StackOverflow 中进行了检查,但找不到匹配的答案,可能也是因为难以描述问题。至少我努力创建了一个可重现的最小示例,以便于帮助我。

【问题讨论】:

标签: r subset


【解决方案1】:

这行得通吗:

library(dplyr)
Df %>% group_by(Candidate.ID) %>% filter(all(Question == 'Yes'))
# A tibble: 3 x 3
# Groups:   Candidate.ID [2]
  Candidate.ID Application.ID Question
         <dbl>          <dbl> <chr>   
1         1042           1040 Yes     
2         1042          13006 Yes     
3         1146           1144 Yes     

【讨论】:

    【解决方案2】:

    data.table

    df <- data.frame("Candidate ID"   = c(1042,  1042, 1113, 1113, 1146, 1277, 1381, 1381, 1402, 1402),
                     "Application ID" = c(1040, 13006, 1111, 1125, 1144, 1274,   41,   61,   64,   65),
                     "Question"     = c("Yes", "Yes", "No","Yes", "Yes","No", "No", "No","Yes", "No"))
    
    
    
    library(data.table)
    setDT(df)[, .SD[all(Question == "Yes")], by = Candidate.ID]
    #>    Candidate.ID Application.ID Question
    #> 1:         1042           1040      Yes
    #> 2:         1042          13006      Yes
    #> 3:         1146           1144      Yes
    

    reprex package (v2.0.0) 于 2021-06-16 创建

    【讨论】:

      【解决方案3】:

      base R 中带有subset 的选项

      1. 提取“Candidate.ID”,其中“问题”值为“是”
      2. 提取“Candidate.ID”,其中“问题”值为“否”
      3. 通过执行 1 和 2 中的 setdiff,获取在“问题”中具有“是”值而不是任何“否”的 unique“Candidate.ID”
      4. 使用“Candidate.ID”创建一个逻辑向量,使用%in%subsettting 行的“Candidate.ID”整列,“Candidate.ID”在“问题”中只有“是”值'
      subset(Df, Candidate.ID %in% setdiff(Candidate.ID[Question == 'Yes'], 
             Candidate.ID[Question == "No"]))
      #  Candidate.ID Application.ID Question
      #1         1042           1040      Yes
      #2         1042          13006      Yes
      #5         1146           1144      Yes
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-11
        • 1970-01-01
        • 2017-01-18
        • 2020-10-10
        相关资源
        最近更新 更多