【问题标题】:How to filter rows where there are changes in a categorical variable如何过滤分类变量发生变化的行
【发布时间】:2021-09-12 01:50:01
【问题描述】:

我们有一个名为 data 的数据框,有 2 列:Time 按升序排列,Place 描述个人所在的位置:

data.frame(Time = seq(1,20,1),
           Place = rep(letters[c(1:3,1)], c(5,5,3,7)))

由于该数据相对于Time 是按升序排列的,因此我们希望对Place 与之前观察结果相比发生变化的行进行子集化。

此数据的结果数据框如下所示:

Time  Place
1      a
6      b
11     c
14     a

请注意,相同的Place 可以稍后出现,就像本例中的Place == a 一样。我们如何在 R 中执行这种子集?

【问题讨论】:

    标签: r filter subset


    【解决方案1】:

    在“地点”的rleid 上应用duplicated

    library(dplyr)
    library(data.table)
    df1 %>%
       filter(!duplicated(rleid(Place)))
    

    或者在base Rrle

    subset(df1, !duplicated(with(rle(Place), rep(seq_along(values), lengths))))
    

    -输出

        Time Place
    1     1     a
    6     6     b
    11   11     c
    14   14     a
    

    【讨论】:

      【解决方案2】:

      另一个使用 subset + tail + head 的基本 R 选项

      subset(
          df,
          c(TRUE, tail(Place, -1) != head(Place, -1))
      )
      

      给了

         Time Place
      1     1     a
      6     6     b
      11   11     c
      14   14     a
      

      【讨论】:

      • 类似的选项是subset(df, c(TRUE, diff(match(Place, unique(Place))) != 0))
      猜你喜欢
      • 2013-05-09
      • 1970-01-01
      • 2019-07-20
      • 2011-06-30
      • 2022-07-29
      • 2019-10-29
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      相关资源
      最近更新 更多