【问题标题】:Filter dataframe within a group with one column meeting an AND condition in R过滤组内的数据框,其中一列满足 R 中的 AND 条件
【发布时间】:2022-02-02 06:54:10
【问题描述】:

我有以下数据框,我只需要过滤那些每组(id)同时具有“摄入”和“排出”的行。结果应该是这样的:

> df <- tibble(id = c(1, 1, 2, 3, 3, 4, 4, 5, 6, 7, 7),
+              type = c("intake", "discharge", "intake", "intake", "discharge",
+                       "intake", "discharge", "intake", "intake", "intake", "discharge"))
> df
      id type     
   <dbl> <chr>    
 1     1 intake   
 2     1 discharge
 3     2 intake   
 4     3 intake   
 5     3 discharge    
 6     4 intake   
 7     4 discharge
 8     5 intake   
 9     6 intake   
10     7 intake   
11     7 discharge

到这里:

      id type     
   <dbl> <chr>    
 1     1 intake   
 2     1 discharge   
 3     3 intake   
 4     3 discharge    
 5     4 intake   
 6     4 discharge 
 7     7 intake   
 8     7 discharge

这样,既不具有摄入量又不具有排出量的组(id)被删除(并且只保留那些同时具有的组)。

我希望这是有道理的......对不起,这是漫长的一天。

【问题讨论】:

    标签: r dplyr filter subset


    【解决方案1】:

    这是一种选择同时具有"intake""discharge" 的组的方法。

    library(dplyr)
    
    values <- c('intake', 'discharge')
    
    df %>%
      group_by(id) %>%
      filter(all(values %in% type) & type %in% values) %>%
      ungroup
    
    #     id type     
    #  <dbl> <chr>    
    #1     1 intake   
    #2     1 discharge
    #3     3 intake   
    #4     3 discharge
    #5     4 intake   
    #6     4 discharge
    #7     7 intake   
    #8     7 discharge
    

    all(values %in% type) 选择具有两个值的完整组,而type %in% values 将在这些组中选择具有两个值之一的行。

    【讨论】:

      【解决方案2】:
      library(dplyr)
      df %>%
        group_by(id) %>%
        filter(sum(type == "intake") >= 1,
               sum(type == "discharge") >= 1) %>%
        # add below if we only want intake/discharge lines
        # filter(type %in% c("intake", "discharge")) %>% 
        ungroup()
      

      结果(由于在 OP 中添加了“其他”,期望的行为不清楚)

      # A tibble: 9 x 2
           id type     
        <dbl> <chr>    
      1     1 intake   
      2     1 discharge
      3     3 intake   
      4     3 discharge
      5     3 other    
      6     4 intake   
      7     4 discharge
      8     7 intake   
      9     7 discharge
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-20
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 2022-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多