从数据框中删除连续的重复值

13

我有一个数据框,想要删除连续的重复行(在基础中)。我知道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

看起来你的例子可以在单个列上进行过滤,但这是你的意图吗? - Matthew Lundberg
没有这个意图,我只是为了方便而使两列内容相同。 - Tyler Rinker
3个回答

9

这里有一种方法,虽然不是用rle,但也是一种方法:

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

这假设您正在使用“factor”列,正如您的样本数据所示。

4
这里有一个使用过滤器的快速解决方案。
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>

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


感谢您对这个问题的认真回复和工作。我很少考虑过过滤器,所以看到它的使用是很有启发性的。 - Tyler Rinker

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), ]

1
这在 OP 的示例数据上可以工作,但如果有连续的两行 'E Feb' 和 'E May',则会失败。 - Matthew Plourde
你是对的!我假设这两列总是有相同的值。 - adibender
感谢您的工作。@马修的更具普适性一些。 - Tyler Rinker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接