Question

Remarque: J'ai changé l'exemple de quand je suis au courant. Mon premier exemple a été trop simplifiée pour saisir le vrai problème.

J'ai deux trames de données qui sont triées différemment dans une colonne. Je veux correspondre une colonne, puis fusionner la valeur de la deuxième colonne. La deuxième colonne doit rester dans le même ordre.

J'ai donc ceci:

state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)

s1
s2

qui renvoie ceci:

> s1
  state value1
1    IA      1
2    IA      2
3    IA      3
4    IL      4
5    IL      5
6    IL      6
> s2
  state value2
1    IL      3
2    IL      4
3    IL      5
4    IA      6
5    IA      7
6    IA      8

et je veux ceci:

  state value1 value2
1    IA      1      6
2    IA      2      7
3    IA      3      8
4    IL      4      3
5    IL      5      4
6    IL      6      5

Je suis sur le point de me conduire à essayer idiot de résoudre ce problème. On dirait que ce devrait être un problème simple indice.

Était-ce utile?

La solution

Il y a plusieurs façons de le faire (il est R, après tout) mais je pense que le plus clair est la création d'un index. Nous avons besoin d'une fonction qui crée un index séquentiel (en commençant par un et se terminant par le nombre d'observations).

seq_len(3) 
> [1] 1 2 3

Mais nous devons calculer cet indice au sein de chaque variable de regroupement (état). Pour cela, nous pouvons utiliser la fonction de ave de R. Il faut un numérique comme premier argument, puis les facteurs de regroupement, et enfin la fonction à appliquer dans chaque groupe.

s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))

(Notez l'utilisation de with, qui indique R pour rechercher les variables dans l'environnement / dataframe. Ceci est une meilleure pratique que d'utiliser s1 value1 $, s2 value2 $, etc.)

Maintenant, nous pouvons simplement fusionner (rejoindre) les deux trames de données (par les variables présentes dans les deux trames de données: état et index).

merge(s1,s2)

qui donne

   state index value1 value2
1    IA     1      1      6
2    IA     2      2      7
3    IA     3      3      8
4    IL     1      4      3
5    IL     2      5      4
6    IL     3      6      5

Pour que cela fonctionne, il devrait y avoir le même nombre d'observations par l'Etat dans chacune des trames de données.

[Edit: a commenté le code pour plus de clarté.] [Edit:. Seq_len Utilisé au lieu de créer une nouvelle fonction telle que suggérée par hadley]

Autres conseils

NOTE: Vérifiez le 5ème commentaire sur la réponse ci-dessus. La solution doit être

s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))

Testé et de travail.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top