【问题标题】:Remove consecutive duplicates from dataframe从数据框中删除连续的重复项
【发布时间】:2012-12-12 22:19:48
【问题描述】:

我有一个数据框,我想删除连续的重复项(在基础中)。我知道rle 在这里可能会有所帮助,但想不出如何使用它。示例输出将有助于阐明我的要求。

生成样本数据:

set.seed(12)
samps <- sample(1:5, 20, T)
dat <- data.frame(v1=LETTERS[samps], v2=month.abb[samps])
dat[10, 2] <- "Mar"

样本数据:

   v1  v2
1   A Jan
2   E May
3   E May
4   B Feb
5   A Jan
6   A Jan
7   A Jan
8   D Apr
9   A Jan
10  A Mar
11  B Feb
12  E May
13  B Feb
14  B Feb
15  B Feb
16  C Mar
17  C Mar
18  C Mar
19  D Apr
20  A Jan

期望的结果:

   v1  v2
1   A Jan
3   E May
4   B Feb
7   A Jan
8   D Apr
10  A Mar
11  B Feb
12  E May
15  B Feb
18  C Mar
19  D Apr
20  A Jan

【问题讨论】:

  • 对于您的示例,似乎可以过滤单个列,但这是意图吗?
  • 不,这不是本意,只是为了方便,我将两列设为相同。我进行了编辑以反映这一点。

标签: r range


【解决方案1】:

这是一种方法,不是rle,而是一种方法:

dat[with(dat, c(TRUE, diff(as.numeric(interaction(v1, v2))) != 0)), ]

这假设您使用的是 factor 列,正如您的示例数据所暗示的那样。

【讨论】:

    【解决方案2】:

    使用rle 我想出了这个

    ind <- cumsum(rle(as.character(dat$v1))$length)
    dat[ind, ]
    

    ind 表示连续条目的第一个或最后一个。

    编辑:

    Matthews 评论的一个简单解决方案是

    dat[15, 2] <- "May"
    dat[cumsum(rle(paste0(dat$v1, dat$v2))$length), ]
    

    【讨论】:

    • 这适用于 OP 的样本数据,但如果有两个连续的行,例如“E Feb”和“E May”,则会失败。
    • 你是对的!我假设这两列总是有相同的值。
    • 感谢您的工作。 @Matthew's 的概括性更强。
    【解决方案3】:

    这里是使用过滤器的快速解决方案

    dat[(filter(dat,c(-1,1))!= 0)[,1],]
         v1   v2
    1     A  Jan
    3     E  May
    4     B  Feb
    7     A  Jan
    8     D  Apr
    10    A  Mar
    11    B  Feb
    12    E  May
    15    B  Feb
    18    C  Mar
    19    D  Apr
    NA <NA> <NA>
    

    您需要将原始数据的最后一个值添加到结果中。

    【讨论】:

    • 周到的回应感谢您在这个问题上所做的工作。我很少考虑过滤器,所以看到使用情况会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多