卸下数据帧连续的重复(Remove consecutive duplicates from data

2019-07-17 15:08发布

我有想要删除是连续的(在碱)重复的数据帧。 我知道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

Answer 1:

这里有一个方式,而不是用rle ,而是一种无- -减:

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

这里假设你正在使用factor列,您的样本数据暗示。



Answer 2:

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

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>

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



Answer 3:

使用rle我想出了这个

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

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

编辑:

一个简单的解决方案,马修斯评论会

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


文章来源: Remove consecutive duplicates from dataframe
标签: r range