2016-06-03 15 views
1

Ich möchte Werte aus verschiedenen Spalten extrahieren, abhängig vom Wert der Spalte x. Diese Spalte befindet sich in einem Datenrahmen 1 und enthält verschiedene Faktorstufen (z. B. 1, 2, 3, 4, 5, 6). Die Spalten, in denen ich die Werte von in Datenrahmen 2. Beispiele für beide Datenrahmen extrahiert werden soll:Werte von verschiedenen Spalten extrahieren

Datenrahmen 1 istrata (173 Zeilen) genannt

> istrata[1:5,] 
     POSCODN Geslacht Agegrp 
    1 2651 0.4761905  1 
    2 2651 0.4761905  5 
    3 2652 0.5785124  1 
    4 2652 0.5785124  1 
    5 2661 0.5270758  3 

Datenrahmen 2 genannt wird strata mit (1721 Zeilen) :

 > strata[1:5,] 
     POSCODN Geslacht agegrp_1 agegrp_2 agegrp_3 agegrp_4 agegrp_5 agegrp_6 
    1  2651 0.4761905 0.34085213 0.10025063 0.13784461 0.27318296 0.13784461 0.010025063 
    2  2652 0.5785124 0.34710744 0.23966942 0.11570248 0.19008264 0.10743802 0.000000000 
    3  2661 0.5270758 0.36462094 0.13357401 0.15162455 0.25270758 0.09747292 0.000000000 
    4  2662 0.6229508 0.39344262 0.26229508 0.11475410 0.21311475 0.01639344 0.000000000 
    5  2665 0.5387931 0.28448276 0.08189655 0.17241379 0.31465517 0.13362069 0.012931034 

So am Ende, dass ich möchte erreichen, wenn in der ersten Reihe von Datenrahmen 1, Agegrp 1 ist, ist es, den Wert des Datenrahmens 2 von Reihe 1 (da ähnliche POSCODN) zuschreibt, Spalte 3 (agegrp_1). Ein weiteres Beispiel, Reihe 5 in Datenrahmen 1 ist in Agegrp 5 und hat POSCODN 2661. So, hier sollte es in Zeile 3 in Datenrahmen aussieht 2 und Spalte 4 (agegrp_3) Siehe Datenrahmen Beispiel unten (Zusatz zu istrata):

 Geslacht  I_Agegrp 
1  0.4761905 0.34085213 
2  0.4761905 0.13784461 
3  0.5785124 0.34710744 
4  0.5785124 0.34710744 
5  0.5270758 0.15162455 

Gibt es eine Möglichkeit, dies zu tun?

Hilfe wird sehr geschätzt!

+1

Sie können eine 2-dimensionale Matrix als Index verwenden 'df [cbind (seq_along (x), x + 1 l) ] ' –

Antwort

2

Von der Hilfe für ?'[':

Wenn Indizierung Arrays von [einem einzigen Argumente i eine Matrix mit als vielen Spalten sein kann, wie es Dimensionen von x sind; das Ergebnis ist dann ein Vektor mit Elementen, die den Mengen von Indizes in jeder Zeile von i entsprechen.

So kann die Teilmenge eine Matrix sein. Spalte 1 wird die Zeilen und Spalte 2 die Spalten darstellen.

Wenn x x <- c(3,2,1,1,1) ist, können wir das mit den Zeilen 1:nrow(df) kombinieren. Die Matrix wird wie folgt aussehen:

cbind(1:nrow(df), x) 
     x 
[1,] 1 3 
[2,] 2 2 
[3,] 3 1 
[4,] 4 1 
[5,] 5 1 

Wenn wir diese Matrix verwenden df[cbind(1:nrow(df), x)] die Teilmenge, die erste Extraktion df[1,3] sein wird, die zweite Extraktion df[2,2] und so weiter. Aber wir müssen die Gender Spalte berücksichtigen und 1 zur zweiten Spalte hinzufügen, x + 1.

df[cbind(1:nrow(df), x+1)] 
[1] 0.1378446 0.2396694 0.3646209 0.3934426 0.2844828 

bearbeiten

Mit den neuen Namen:

strata[cbind(1:nrow(strata), istrata$Agegrp + 1L)] 
+0

Danke, nur bin ich noch ein bisschen verloren. Bezieht sich "df" auf Datenrahmen 1 oder Datenrahmen 2? Und 'x + 1' funktioniert nicht, da die Spaltennamen im Datenrahmen 2 unterschiedlich sind. Oder fehlt mir etwas? – Keizer

+0

Yes 'df' ist nur ein Beispiel für einen Datenrahmennamen. 'x' steht für die Spalte mit' 3 2 1 1 1'. Sie haben keine Datenrahmennamen angegeben, daher habe ich einen Standardnamen verwendet. Wenn Sie möchten, dass ich buchstäblich Ihren gesamten Code für Sie schreibe. Gib mir die Namen beider mit den entsprechenden Spaltennamen. –

+0

Danke, weil ich nicht ganz verstehe was zu ändern ist. Ich habe meinen Beitrag mit den Datenrahmen- und Spaltennamen und den ersten 5 Zeilen der Daten aktualisiert. – Keizer

Verwandte Themen