我有一个数据帧,我想删除重复的连续(在基数)。我知道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
这里有一种方法,不是用rle
,而是一种方法:
dat[with(dat, c(TRUE, diff(as.numeric(interaction(v1, v2))) != 0)), ]
这里假设您使用的是factor
列,如您的样本数据所示。
这里有一个使用过滤器的快速解决方案
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>
您需要将原始数据的最后一个值添加到结果中
使用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), ]