删除连续重复的条目

6
如何在R中删除连续重复的条目?我认为可以使用with,但不知道如何使用它。以下是一个示例:
read.table(text = "
   a        t1
   b        t2
   b        t3
   b        t4
   c        t5
   c        t6
   b        t7
   d        t8")

Sample Data: 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

`

4个回答

12

还有另一个假设您的data.frame命名为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 这也是我的答案。我看到 OP 的问题时,当他们说“删除连续重复条目”时,我想使用 cumsum(rle(df$Event)$lengths) - rle(df$Event)$lengths + 1 取每个的第一个。 - Simon O'Hanlon
+1,绝对比我有点具有挑战性的组合 rlemapplysplittaildo.call 更好。 - Henrik

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

这很接近,但并没有完全达到原帖作者的预期结果。不过我之前从未听说过 fromLast=TRUE 这个参数,真是太棒了。 - thelatemail
哦糟糕!有两个b行! - Xachriel

0
一个在基本R中使用分割-应用-合并的解决方案通过使用tail函数来返回最后一个元素,以及结合rlemapply来创建一个新的events向量,在事件重新出现的情况下保持顺序:
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)

这将产生所需的输出。


谢谢你的帮助,但问题有一点变化。另外,在使用 tail 命令时,顺序是否保持不变?我尝试了一下,它按字母顺序对事件进行排序。 - anu

0

为了安全起见,可以使用 headtail

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

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