删除连续的重复条目

时间:2013-07-15 09:17:51

标签: r duplicates with-statement

如何删除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

`

4 个答案:

答案 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函数工作,该函数返回最后一个元素,rlemapply结合使用,以创建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)

为了更好地衡量,请使用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