2013-07-15 10 views
6

Wie aufeinanderfolgende doppelte Einträge in R zu entfernen? Ich denke, with kann verwendet werden, kann aber nicht denken, wie man es benutzt. ein Beispiel veranschaulicht:Entfernen Sie aufeinanderfolgende doppelte Einträge

read.table(text = " 
    a  t1 
    b  t2 
    b  t3 
    b  t4 
    c  t5 
    c  t6 
    b  t7 
    d  t8") 

Beispieldaten: D

events time 
     a  t1 
     b  t2 
     b  t3 
     b  t4 
     c  t5 
     c  t6 
     b  t7 
     d  t8 

Required Ergebnis:

 events  time 
     a  t1 
     b  t4 
     c  t6 
     b  t7 
     d  t8 

`

Antwort

0

Eine Lösung in der Basis R mit Split-apply-kombiniert Arbeiten über die tail Funktion, die das letzte Element und rle in Kombination mitzurückgibteinen neuen Vektor von events zu erstellen, das die Reihenfolge im Fall von Ereignissen bewahrt wieder auftauchen:

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) 

Dies erzeugt die gewünschte Ausgabe.

+0

Vielen Dank für die Hilfe, aber es gibt eine kleine Änderung in der Frage. Bleibt die Reihenfolge auch bei der Verwendung von "Tail"? Ich habe es versucht und sortiert die Ereignisse in alphabetischer Reihenfolge. – anu

+0

@anu bitte mein update, sollte jetzt funktionieren. – Henrik

2

EDIT: Nicht genau richtig, da es nur eine B-Zeile zeigt. Sie können auch die dupliziert() Funktion verwenden

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

Dies ist nahe, aber es gibt nicht das beabsichtigte Ergebnis des OP. Ich wusste aber nie von 'fromLast = TRUE' - ziemlich ordentlich. – thelatemail

+0

Oh verdammt! Es gab zwei B-Reihen! – Xachriel

12

Noch eine andere, Ihr vorausgesetzt data.frmae wird d genannt:

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 Das würde auch meine Antwort sein. Ich las die OP-Frage und als sie sagten * entfernen aufeinanderfolgende doppelte Einträge * Ich dachte, die erste von jedem mit 'Cumsum (RLE (Df $ Event) $ Längen) - RLE (Df $ Event) $ Längen + 1 ' –

+0

+ 1, definitiv besser als meine etwas herausfordernde Kombination von 'rle',' mapply', 'split',' tail', 'do.call', ... – Henrik

0

Und für eine gute Maßnahme, mit head und 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