Entfernen/reduzieren aufeinander folgende doppelte Werte in der Reihenfolge
Habe ich Folgendes dataframe:
a a a b c c d e a a b b b e e d d
Dem gewünschten Ergebnis sollte
a b c d e a b e d
Es bedeutet, dass keine zwei aufeinander folgenden Zeilen haben denselben Wert. Wie es getan werden kann, ohne mit Schleife.
Als mein Datensatz ist Recht groß, looping nimmt sich viel Zeit, um Sie auszuführen.
Den dataframe Struktur ist wie folgt
a 1
a 2
a 3
b 2
c 4
c 1
d 3
e 9
a 4
a 8
b 10
b 199
e 2
e 5
d 4
d 10
Ergebnis:
a 1
b 2
c 4
d 3
e 9
a 4
b 10
e 2
d 4
Sein sollte, löschen Sie die gesamte Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine einfache Möglichkeit ist die Verwendung
rle
:Hier Beispieldaten:
rle
gibt einelist
mit zwei Werten: die run-Länge ("lengths
"), und der Wert, der wiederholt für diesen Lauf ("values
").Update: Für eine
data.frame
Wenn Sie arbeiten mit einem
data.frame
, versuchen Sie etwas wie die folgenden:Update 2
Den "Daten.Tabelle" Paket hat eine Funktion
rleid
können Sie dies ganz einfach tun. Mitmydf
von oben versuchen:data.frame
Lösung, die ich gefunden, die ich brauchteX <- rle(as.numeric(mydf$V1))
alsV1
ist ein Faktor. Andere Bemerkung: ich habe festgestellt, dass in einigen Fällencumsum(X$lengths)
würde die Arbeit machen, je nachdem, welche doppelte Zeilen, die Sie behalten wollen (von oben nach unten v. unten nach oben), tun Sie das bestätigen?BEARBEITEN: Für
data.frame
dplyr-Lösung ist eine liner:
post scriptum
lead(x,1)
vorgeschlagen von @Carl Witthoft durchläuft in umgekehrter Reihenfolge.dplyr::lag
hier? Ich habe versucht den code mit einem sauberen Sitzung und es doenst Arbeit mitstats::lag
install.packages('dplyr')
wenn Sie nicht überdplyr
auf Ihrem computer installiert.Mit der Basis R, I-wie komisch Algorithmik:
tail
so etwas wiex[x != c(x[-1], FALSE)]
data.frame
. In einem dataframe, RS,FALSE
schränkt den Vektor vom Typinteger
, also auf LSx
muss so eingeschränkt, damit der Vergleich möglich sein, mitas.integer()
. Korrigieren Sie mich, wenn ich falsch bin!Viel wie ich,... ähhh, Liebe
rle
hier ein shootoff:EDIT: Kann nicht herausfinden, was genau mit
dplyr
so habe ichdplyr::lead
. Ich bin auf OSX, R3.1.2, und die Letztedplyr
von CRAN.lagit
für Sie arbeiten? Es gibt mir nichts. Vielleicht ist dies, warum Ihr die schnellsten....dplyr
, wie ich vermutelagit
ist nicht etwas zu tun derzeit und somit sehr schnelldplyr::lag
tailit
Funktion in Ihrem benchmark fehlt das Letzte "d" in der vector.. vielleicht update aufx[x!=c(x[-1], FALSE)]
wie in der Antwortlead
ist etwas langsamer alslag
. Warum ist das so? github.com/hadley/dplyr/blob/master/R/lead-lag.Rlagit
zurückgegeben null, da hatte ich eine Vielzahl von Werten, so gab es keine Wiederholungen. Wenn Sie erneut meinem Fall mitxlet<-sample(letters[1:7],1e5,rep=T)
bekommst du einige Treffer.