【问题标题】:Subset data in groups based on column values基于列值的分组数据子集
【发布时间】:2020-10-23 17:17:08
【问题描述】:

以下数据按其 ID 分组。我正在尝试根据以下条件对该数据框进行子集化:对于任何具有D2 == 1 的 ID,删除我们第一次观察到的行下方的行。其次,对于任何带有D1 == 0D2 == 0 的ID,删除此点下方的行(如果此ID 在此点之前没有D2 == 1)。

df<-data.frame(id=c(1,1,1,2,2,2,2,3,3),
            A=c(3,6,2,5,4,3,8,9,8),
           D1=c(0,0,0,1,1,0,0,0,0),
           D2=c(1,0,0,0,0,1,1,0,1))

我已经考虑过了

df %>%
group_by(id) %>%
filter(...)

但我不清楚如何完成filter 函数来执行此任务。我希望输出看起来像

  id A D1 D2
1  1 3  0  1
2  2 5  1  0
3  2 4  1  0
4  2 3  0  1
5  3 9  0  0

感谢您对此提供的任何帮助!

【问题讨论】:

    标签: r dataframe filter dplyr subset


    【解决方案1】:

    此解决方案中filter 背后的基本原理是:对于每个id,对于验证ifelse 内部条件的行,我们将临时计数器加1;因此,对于每个 id,我们希望只过滤那些临时计数器小于或等于 1 的行(因此只取值 0 和 1)。

    df %>% 
      group_by(id) %>% 
      filter(cumsum(ifelse(D2 == 1 | (D1 == 0 & D2 == 0), 1, 0)) <= 1)
    
    # A tibble: 5 x 4
    # Groups:   id [3]
    #      id     A    D1    D2
    #   <dbl> <dbl> <dbl> <dbl>
    # 1     1     3     0     1
    # 2     2     5     1     0
    # 3     2     4     1     0
    # 4     2     3     0     1
    # 5     3     9     0     0
    

    【讨论】:

      【解决方案2】:

      找到满足您的一个条件的第一行并取之前的所有行(包括满足条件的第一行)。如果没有任何行满足给定条件,则取所有行:

      df %>% 
        group_by(id) %>%
        slice(
          match(TRUE, D2 == 1 | (D1 == 0 & D2 == 0), nomatch = n()) %>% seq_len()
        )
      

      【讨论】:

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