Frage

Hinweis: Ich änderte das Beispiel aus, wenn ich zum ersten Mal veröffentlicht. Mein erstes Beispiel wurde auch vereinfacht das eigentliche Problem zu erfassen.

Ich habe zwei Datenrahmen, die unterschiedlich in einer Spalte sortiert werden. Ich möchte eine Spalte passen und dann in dem Wert aus der zweiten Spalte fusionieren. Die zweite Spalte muss in der gleichen Reihenfolge bleiben.

So habe ich dies:

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

welche gibt diese:

> 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

und ich möchte dies:

  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

Ich bin über mich dumm zu fahren versuchen, dieses Problem zu lösen. Scheint, als ob es ein einfacher Index Problem sein sollte.

War es hilfreich?

Lösung

Es gibt mehrere Möglichkeiten, dies zu tun (es ist R, nachdem alle), aber ich denke, die meisten klar einen Index erstellt. Wir brauchen eine Funktion, die einen sequentiellen Index (beginnend mit ein und endet mit der Anzahl der Beobachtungen) erstellt.

seq_len(3) 
> [1] 1 2 3

Aber wir müssen diesen Index innerhalb jeder Gruppenvariablen (Zustand) berechnen. Hierfür können wir R ave-Funktion verwenden. Es dauert eine numerische als erstes Argument, dann die Gruppierungsfaktoren und schließlich die Funktion in jeder Gruppe angewendet werden.

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

(Beachten Sie die Verwendung von with, die R für die Variablen innerhalb der Umgebung / Datenrahmen suchen erzählt. Das ist besser Praxis als s1 $ value1 mit, s2 $ value2, usw.)

Jetzt können wir einfach zusammenführen (Join) die beiden Datenrahmen (durch die Variablen, die in den beiden Datenrahmen: Zustand und Index).

merge(s1,s2)

das gibt

   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

Damit dies funktioniert, sollte es in jedem der Datenrahmen die gleiche Anzahl von Beobachtungen Zustand sein.

[Edit: kommentiert den Code für Klarheit.] [Edit:. Gebrauchte seq_len stattdessen eine neue Funktion zu schaffen, wie durch hadley vorgeschlagen]

Andere Tipps

Hinweis: Überprüfen Sie den 5. Kommentar über die Antwort oben. Lösung sollte

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

Geprüft und arbeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top