R - assurer l'observation par groupe identifié par plusieurs variables (Stata équivalent “bys var1 var2 : garder si _n == 1”)
J'ai donc actuellement confrontés à un problème dans la R que je savais exactement comment traiter avec dans Stata, mais ont perdu plus de deux heures pour accomplir dans l'arrêt R.
En utilisant les données.image ci-dessous, le résultat que je veux, c'est d'obtenir exactement la première observation par groupe, alors que les groupes sont formés par de multiples variables et doivent être triées par une autre variable, c'est à dire les données.cadre mydata obtenue par:
id <- c(1,1,1,1,2,2,3,3,4,4,4)
day <- c(1,1,2,3,1,2,2,3,1,2,3)
value <- c(12,10,15,20,40,30,22,24,11,11,12)
mydata <- data.frame(id, day, value)
Devrait être transformée en:
id day value
1 1 10
1 2 15
1 3 20
2 1 40
2 2 30
3 2 22
3 3 24
4 1 11
4 2 11
4 3 12
En ne gardant que l'une des lignes avec un ou plusieurs groupe en double-identificators (ici c'est seulement row[1]: (id,day)=(1,1))
, du tri pour la première valeur (de sorte que la ligne avec la valeur la plus basse).
Dans Stata, ce serait tout simplement:
bys id day (value): keep if _n == 1
J'ai trouvé un morceau de code sur le web, qui fait que si j'ai d'abord produire un seul identificateur de groupe :
mydata$id1 <- paste(mydata$id,"000",mydata$day, sep="") ### the single group identifier
myid.uni <- unique(mydata$id1)
a<-length(myid.uni)
last <- c()
for (i in 1:a) {
temp<-subset(mydata, id1==myid.uni[i])
if (dim(temp)[1] > 1) {
last.temp<-temp[dim(temp)[1],]
}
else {
last.temp<-temp
}
last<-rbind(last, last.temp)
}
last
Cependant, il existe quelques problèmes avec cette approche:
1. Un identifiant unique doit être créé (ce qui est vite fait).
2. Il semble comme un lourd morceau de code par rapport à la ligne de code dans Stata.
3. Sur une moyenne de dataset (en dessous de 100 000 observations regroupées en lots de 6 environ), cette approche devrait prendre environ 1,5 heures.
Est-il efficace équivalent à Stata est bys var1 var2: keep if _n == 1
?
Je ne veux pas être insultant envers R, si c'est ce que cela ressemble. J'ai été dans le processus de migration à partir du logiciel Stata pour les deux dernières semaines et ai encore de la difficulté à obtenir les fonctionnalités de base droite.
Pour commencer avec votre migration, alors qu'il est possible d'utiliser
for
boucles efficacement dans R, si c'est votre premier recours, il pourrait ne pas être le moyen le plus efficace d'aller.Pas de doute, je suis juste de les conseiller sur la manière d'influencer les gens et les encourager à répondre à votre question.
OriginalL'auteur iraserd | 2014-02-04
Vous devez vous connecter pour publier un commentaire.
Je voudrais commander le
data.frame
à quel point vous pouvez regarder dans l'aide deby
:Sinon, regarde dans les données".tableau". En continuant avec la commande
data.frame
à partir de ci-dessus:Ou, à compter à partir de zéro, vous pouvez utiliser
data.table
de la manière suivante:Et, par extension, dans la base de R:
Je trouve aussi qu'il est difficile de croire qu'aucune de ces approches ne prennent 1,5 heures. Pouvez-vous ajouter plus d'informations à propos de vos données?
Eh bien, je l'ai abandonnée pour la boucle approche que j'ai posté après environ 15 minutes, et puis il avait traité environ 12k de 80k observations.
Mahto, bon, alors pour un petit sous-échantillon de mon dataset, tous les 3 de vos solutions de rechange fonctionne parfaitement bien. Toutefois, sur l'ensemble des données (environ 500k observations), par() et DT[] semblent prendre beaucoup plus longtemps que les (ave). (Ave) juste fini au bout de 5 min, alors que je l'ai abandonnée par() et DT[] après environ 10 minutes chacune. (Ave) donc la bonne réponse était la pour moi, merci!
Je trouve cela surprenant. Les données".tableau" package doit être très efficace. Combien de combinaisons uniques de "id" variables avez-vous? Dans mon test de 500k
data.frame
, je m'y ~ 1 minute pour que les données".tableau" approche, et deux minutes pourave
.OriginalL'auteur A5C1D2H2I1M1N2O1R2T1
Le paquet dplyr fait ce genre de choses plus facile.
Cette commande nécessite plus de mémoire dans les R que dans Stata: les lignes ne sont pas supprimées en place une nouvelle copie de la base de données est créée.
Probablement. Il met l'objet sur la gauche et le premier argument de la fonction vers la droite. la première ligne est équivalente à la tranche(organiser(group_by(mydata, id, jour), de la valeur), 1)
OriginalL'auteur Matthew