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 suis un Stata personne, mais je ne voudrais pas compter au charme R utilisateurs ici par ce qui implique que R est moche, même pour un seul détaillée tâche très spécifique. Mieux de laisser entendre qu'il doit être soigné de la R moyen de le faire, c'est juste que vous n'avez pas identifié.
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