【问题标题】:How can one sort data in r based on a condition being met and time ordering?如何根据满足的条件和时间顺序对 r 中的数据进行排序?
【发布时间】:2021-06-23 16:53:36
【问题描述】:

如果我有以下数据集:

df<-data.frame(ID = c(1,1,1,1,2,2,2,2),
           x = c("no","yes","no","no","no","yes", "no"),
           y= c(1,2,3,4,1,2,3,4))
ID x y
1 no 1
1 yes 2
1 no 3
1 no 4
2 no 1
2 no 2
2 yes 3
2 no 4

ID 是一个标识符,x 告诉我们是否满足条件,y 是每个 ID 唯一的时间顺序(尽管在真实数据集中它可能是一个日期)。如何删除不满足条件的行,但保留满足条件的行,或在满足条件后发生的事件?

最终结果应如下所示:

ID x y
1 yes 2
1 no 3
1 no 4
2 yes 3
2 no 4

【问题讨论】:

  • 复制数据帧,代码返回错误Error in data.frame arguments imply differing number of rows: 8, 7

标签: r sorting data-manipulation


【解决方案1】:

使用ave + subset 的基本 R 选项

subset(
  df,
  ave(x == "yes", ID, FUN = cumsum) > 0
)

给予

  ID   x y
2  1 yes 2
3  1  no 3
4  1  no 4
7  2 yes 3
8  2  no 4

遵循与上述相同想法的data.table选项是

> setDT(df)[, .SD[cumsum(x == "yes") > 0], ID]
   ID   x y
1:  1 yes 2
2:  1  no 3
3:  1  no 4
4:  2 yes 3
5:  2  no 4

【讨论】:

    【解决方案2】:

    在按“ID”分组后,在“yes”的“x”值上创建一个带有cumsum 的逻辑表达式

    library(dplyr)
    df %>% 
       group_by(ID) %>%
       filter(cumsum(x == 'yes') >0) %>%
       ungroup
    

    -输出

    # A tibble: 5 x 3
    #     ID x         y
    #  <dbl> <chr> <dbl>
    #1     1 yes       2
    #2     1 no        3
    #3     1 no        4
    #4     2 yes       3
    #5     2 no        4
    

    【讨论】:

      【解决方案3】:

      您可以使用match 获取每个ID 的第一个'yes' 的索引,并在filterslice 中使用它。

      library(dplyr)
      
      df %>%
        group_by(ID) %>%
        filter(row_number() >= match('yes', x)) %>%
        ungroup
      

      slice

      df %>%
        group_by(ID) %>%
        slice(match('yes', x):n()) %>%
        ungroup
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2019-06-24
        • 1970-01-01
        • 2013-07-21
        • 1970-01-01
        • 2021-08-19
        • 1970-01-01
        相关资源
        最近更新 更多