6

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

4 回答 4

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
于 2013-07-15T09:41:30.937 回答
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), ]
于 2013-07-15T09:39:02.960 回答
0

为了更好地衡量,使用headand 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
于 2013-07-15T10:03:39.860 回答
0

在基本 R 中使用 split-apply-combine 的解决方案通过tail返回最后一个元素的函数工作,并rle结合mapply创建一个新向量,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)

这会产生所需的输出。

于 2013-07-15T09:26:53.063 回答