如何删除R中的连续重复条目?我认为可能会使用with
,但无法思考如何使用它。举一个例子说明:
read.table(text = "
a t1
b t2
b t3
b t4
c t5
c t6
b t7
d t8")
样本数据:D
events time
a t1
b t2
b t3
b t4
c t5
c t6
b t7
d t8
要求结果:
events time
a t1
b t4
c t6
b t7
d t8
`
答案 0 :(得分:12)
然而另一个,假设您的data.frmae
名为d
:
d[cumsum(rle(as.numeric(d[,1]))$lengths),]
V1 V2
1 a t1
4 b t4
6 c t6
7 b t7
8 d t8
答案 1 :(得分:2)
编辑:不完全正确,因为它只显示一个b行。 您还可以使用duplicated()函数
x <- read.table(text = " events time
a t1
b t2
b t3
b t4
c t5
c t6
d t7", header = TRUE)
#Making sure the data is correctly ordered!
x <- x[order(x[,1], x[,2]), ]
x[!duplicated(x[,1], fromLast=TRUE), ]
答案 2 :(得分:0)
使用split-apply-combine的基本R中的解决方案通过tail
函数工作,该函数返回最后一个元素,rle
与mapply
结合使用,以创建events
的新向量1}}在重新出现事件时保留顺序:
x <- read.table(text = " events time
a t1
b t2
b t3
b t4
c t5
c t6
b t7
d t8", header = TRUE)
# create vector of new.events (i.e., preserve reappearing objects)
occurences <- rle(as.character(x$events))[["lengths"]]
new.events <- unlist(mapply(rep, x = letters[seq_along(occurences)], times = occurences))
# split into sublists per event
s1 <- split(x, list(new.events))
# get last element from list
s2 <- lapply(s1, tail, n = 1)
# combine again
do.call(rbind, s2)
这会产生所需的输出。
答案 3 :(得分:0)
为了更好地衡量,请使用head
和tail
:
dat[with(dat,c(tail(events,-1) != head(events,-1),TRUE)),]
events time
1 a t1
4 b t4
6 c t6
7 b t7
8 d t8