A veces necesito obtener solo la primera fila de un conjunto de datos agrupados por un identificador, como al recuperar la edad y el género cuando hay múltiples observaciones por individuo. ¿Cuál es una forma rápida (o la más rápida) de hacer esto en R? Usé agregado () a continuación y sospecho que hay mejores formas. Antes de publicar esta pregunta, busqué un poco en Google, encontré e intenté ddply, y me sorprendió que fuera extremadamente lento y me dio errores de memoria en mi conjunto de datos (400,000 filas x 16 cols, 7,000 ID únicos), mientras que la versión agregada () fue razonablemente rápido.
(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,])
ACTUALIZACIÓN: Vea la respuesta de Chase y el comentario de Matt Parker para lo que considero el enfoque más elegante. Consulte la respuesta de @Matthew Dowle para obtener la solución más rápida que utiliza el data.table
paquete.
diff()
para que pueda recoger la primera ID dx
.