A volte ho bisogno di ottenere solo la prima riga di un set di dati raggruppati per un identificatore, come quando si recuperano età e sesso quando ci sono più osservazioni per individuo. Qual è un modo veloce (o il più veloce) per farlo in R? Ho usato aggregate () sotto e sospetto che ci siano modi migliori. Prima di pubblicare questa domanda ho cercato un po 'su Google, ho trovato e provato ddply e sono rimasto sorpreso dal fatto che fosse estremamente lento e mi ha dato errori di memoria nel mio set di dati (400.000 righe x 16 cols, 7.000 ID univoci), mentre la versione aggregate () era ragionevolmente veloce.
(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,])
AGGIORNAMENTO: vedi la risposta di Chase e il commento di Matt Parker per quello che considero l'approccio più elegante. Vedi la risposta di @Matthew Dowle per la soluzione più veloce che utilizza il data.table
pacchetto.
diff()
modo da poter raccogliere il primo ID in dx
.