Parfois, je n'ai besoin d'obtenir que la première ligne d'un ensemble de données regroupées par identifiant, comme lors de la récupération de l'âge et du sexe lorsqu'il y a plusieurs observations par individu. Quel est le moyen le plus rapide (ou le plus rapide) de le faire dans R? J'ai utilisé l'agrégat () ci-dessous et je pense qu'il existe de meilleures façons. Avant de poster cette question, j'ai cherché un peu sur Google, trouvé et essayé ddply, et j'ai été surpris que cela soit extrêmement lent et m'a donné des erreurs de mémoire sur mon jeu de données (400 000 lignes x 16 colonnes, 7 000 ID uniques), tandis que la version agrégée () était assez rapide.
(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,])
MISE À JOUR: Voir la réponse de Chase et le commentaire de Matt Parker pour ce que je considère comme l'approche la plus élégante. Voir la réponse de @Matthew Dowle pour la solution la plus rapide qui utilise le data.table
package.
diff()
afin que vous puissiez récupérer le premier identifiant dx
.