2013-07-15 156 views
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 

`

回答

0

使用經由分裂申請-結合作品在基R A溶液返回最後一個元素的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) 

這產生所需的輸出。

+0

感謝您的幫助,但問題稍有改變。在使用'tail'的順序也一樣嗎?我試過這個,它按字母順序排列事件。 – anu

+0

@anu請看我的更新,現在應該工作。 – Henrik

2

編輯:不完全正確,因爲它只顯示一個B行。 您也可以使用複製()函數

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

這很接近,但並沒有完全給出OP的預期結果。儘管我從不知道「fromLast = TRUE」 - 非常整齊。 – thelatemail

+0

哦,該死!有兩排b! – Xachriel

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 
+0

+1這也是我的回答。我讀了OP問題,當他們說*刪除連續的重複條目*我以爲每個使用'cumsum(rle(df $ Event)$長度) - rle(df $事件)$長度+1' –

+0

+ 1,肯定比我更有挑戰性的組合'rle','mapply','split','tail','do.call',... – Henrik

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