【问题标题】:Retain rows up to first occurrence of a value in a column, by group. Groups without value allowed按组保留行,直到列中的值第一次出现。允许没有值的组
【发布时间】:2015-07-30 22:00:12
【问题描述】:

我有一个像这样的数据框:

> df
  id type
1  1    a
2  1    a
3  1    b
4  1    a
5  1    b
6  2    a
7  2    a
8  2    b
9  3    a
10 3    a

我想将每个组 (id) 的所有行保留到类型列中值“b”的第一次出现。对于没有类型“b”的组,我想保留他们的所有行。

生成的数据框应如下所示:

> dfnew
  id type
1  1    a
2  1    a
3  1    b
4  2    a
5  2    a
6  2    b
7  3    a
8  3    a

我尝试了以下代码,但它保留了超出第一次出现“b”的值为“a”的其他行,并且只排除了额外出现的“b”,这不是我想要的。请看下面的第 4 行。我想摆脱它。

> df %>% group_by(id) %>% filter(cumsum(type == 'b') <= 1)
Source: local data frame [7 x 2]
Groups: id

  id type
1  1    a
2  1    a
3  1    b
4  1    a
5  2    a
6  2    a
7  2    b
8  3    a
9  3    a

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以将matchwhichslice 或(如@Richard 所述)which.max 结合使用

    library(dplyr)
    df %>% 
      group_by(id) %>% 
      slice(if(any(type == "b")) 1:which.max(type == "b") else row_number())    
    # Source: local data table [8 x 2]
    # Groups: id
    # 
    #   id type
    # 1  1    a
    # 2  1    a
    # 3  1    b
    # 4  2    a
    # 5  2    a
    # 6  2    b
    # 7  3    a
    # 8  3    a
    

    或者你可以试试data.table

    library(data.table)
    setDT(df)[, if(any(type == "b")) .SD[1:which.max(type == "b")] else .SD, by = id]
    #    id type
    # 1:  1    a
    # 2:  1    a
    # 3:  1    b
    # 4:  2    a
    # 5:  2    a
    # 6:  2    b
    # 7:  3    a
    # 8:  3    a
    

    【讨论】:

    • 或者只是which.max()
    • 我的数据框出现此错误:错误:NA/NaN 参数。我相信的原因是因为并非所有“组”都有类型 == 'b'。
    • slice(1:which.max(type == "b")) 不会出现该错误,但在这种情况下您想要的输出是什么?
    • 我根据这个用例和所需的输出修改了我的问题。我使用的命令正确处理了这种情况,但没有排除遇到类型“b”后出现的行。我会试试 which.max()。
    • 好的,看看我的编辑和另一个使用data.table的解决方案
    猜你喜欢
    • 2019-08-10
    • 2019-10-15
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2020-01-03
    • 2015-04-24
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多