我有一个数据框,我想删除连续的(基础)重复项。我知道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
答案 0 :(得分:9)
这是一种方式,而不是rle
,但不是一种方式:
dat[with(dat, c(TRUE, diff(as.numeric(interaction(v1, v2))) != 0)), ]
这假设您正在使用factor
列,正如您的示例数据所暗示的那样。
答案 1 :(得分: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>
您需要将原始数据的最后一个值添加到结果中。
答案 2 :(得分: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), ]