【问题标题】:Filtering in a group over multiple rows in R在 R 中对多行进行分组过滤
【发布时间】:2021-10-01 06:24:12
【问题描述】:

我有一个看起来像这样的数据框,带有 ID 和两个条件:

df <- data.frame(ID=c("A", "A", "A", "B", "C"), cond1=c("yes", "yes", "no", "no", "yes"), cond2=c("no", "no", "yes", "yes", "yes"))
df
   ID cond1 cond2
1  A   yes    no
2  A   yes    no
3  A    no   yes
4  B    no   yes
5  C   yes   yes

我想过滤适用 cond1 和 cond2 的 ID (=yes),但它不必在同一行中为真。这意味着我想过滤掉 ID A 和 C,而不是 B。

我尝试使用 dplyr 对 group_by() 和 filter() 进行分组:

df %>%
group_by(PID)%>%
filter(cond1==yes&cond2==yes)

但这只会过滤掉 cond 1 和 cond 2 都适用的 PID/行(因此只有 ID C/行 5)。

我可以做些什么来按组过滤 PID/行,其中两个条件都 t0 在一组内为真,但不在一行内?

谢谢!

【问题讨论】:

    标签: r if-statement filter dplyr group-by


    【解决方案1】:

    你可以使用any -

    library(dplyr)
    
    df %>%
      group_by(ID) %>%
      filter(any(cond1 == 'yes') && any(cond2 == 'yes')) %>%
      ungroup
    
    #  ID    cond1 cond2
    #  <chr> <chr> <chr>
    #1 A     yes   no   
    #2 A     yes   no   
    #3 A     no    yes  
    #4 C     yes   yes  
    

    【讨论】:

    • 您需要两个和符号 (&&) 还是一个 (&) 可以吗?
    • 一个也可以,并返回相同的输出,但&amp;&amp; 更快。
    【解决方案2】:

    data.table 选项

    > setDT(df)[, .SD[all(colSums(.SD == "yes") > 0)], ID]
       ID cond1 cond2
    1:  A   yes    no
    2:  A   yes    no
    3:  A    no   yes
    4:  C   yes   yes
    

    【讨论】:

      【解决方案3】:

      使用base R

      subset(df, ave(cond1 == 'yes', ID, FUN = any) &
                  ave(cond2 == 'yes', ID, FUN = any))
      

      -输出

       ID cond1 cond2
      1  A   yes    no
      2  A   yes    no
      3  A    no   yes
      5  C   yes   yes
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-03
        • 2023-01-25
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多