Manchmal muss ich nur die erste Zeile eines Datensatzes abrufen, der nach einem Bezeichner gruppiert ist, z. B. beim Abrufen von Alter und Geschlecht, wenn mehrere Beobachtungen pro Person vorliegen. Was ist ein schneller (oder der schnellste) Weg, dies in R zu tun? Ich habe aggregate () unten verwendet und vermute, dass es bessere Möglichkeiten gibt. Bevor ich diese Frage postete, suchte ich ein bisschen bei Google, fand und probierte ddply und war überrascht, dass es extrem langsam war und mir Speicherfehler in meinem Datensatz (400.000 Zeilen x 16 Spalten, 7.000 eindeutige IDs) und in der aggregate () -Version bescherte war einigermaßen schnell.
(dx <- data.frame(ID = factor(c(1,1,2,2,3,3)), AGE = c(30,30,40,40,35,35), FEM = factor(c(1,1,0,0,1,1))))
# ID AGE FEM
# 1 30 1
# 1 30 1
# 2 40 0
# 2 40 0
# 3 35 1
# 3 35 1
ag <- data.frame(ID=levels(dx$ID))
ag <- merge(ag, aggregate(AGE ~ ID, data=dx, function(x) x[1]), "ID")
ag <- merge(ag, aggregate(FEM ~ ID, data=dx, function(x) x[1]), "ID")
ag
# ID AGE FEM
# 1 30 1
# 2 40 0
# 3 35 1
#same result:
library(plyr)
ddply(.data = dx, .var = c("ID"), .fun = function(x) x[1,])
UPDATE: Siehe Chases Antwort und Matt Parkers Kommentar zu dem, was ich für den elegantesten Ansatz halte. Die schnellste Lösung, die das data.table
Paket verwendet, finden Sie in der Antwort von @Matthew Dowle .
diff()
damit Sie die erste ID in auswählen können dx
.