2016-06-08 14 views
1

Ich habe einen Datensatz wie folgt. ds =Matching Variablenwert zu Spalte, um Wert im Datenrahmen

 hilldown_pod hillup_pod gnlsup_pod gnlsdown_pod  bestfit 
1   NaN  NaN -2.8977432 -0.21143302   <NA> 
2   NaN 0.1055303 0.1041875 -3.07497883 hillup_pod 
3 -0.06537934  NaN  NaN -0.06548488 hilldown_pod 
4   NA -3.1700006 -3.0994209   NA hillup_pod 
5   NaN  NaN  NaN   NaN   <NA> 

Ich will eine neue Spalte erstellen, das etwas ähnlich ein HLOOKUP in Excel tut. Für jede Zeile möchte ich die Namen (ds) nach dem Wert in der Spalte "bestfit" suchen und den Wert abrufen, der dem übereinstimmenden Spaltennamen für diesen Datensatz zugeordnet ist. Zum Beispiel wäre letzte Spalte wie folgt:

hilldown_pod hillup_pod gnlsup_pod gnlsdown_pod  bestfit  wanted 
1   NaN  NaN -2.8977432 -0.21143302   <NA>   NA 
2   NaN 0.1055303 0.1041875 -3.07497883 hillup_pod 0.10553030 
3 -0.06537934  NaN  NaN -0.06548488 hilldown_pod -0.06537934 
4   NA -3.1700006 -3.0994209   NA hillup_pod -3.17000060 
5   NaN  NaN  NaN   NaN   <NA>   NA 

Ich habe einige anzuwenden versucht, Funktionen und Spiel, aber ich bin nicht Syntax richtig hinzubekommen.

ds$wanted[which(ds[,(match(ds$bestfit,names(ds))] 

komplizierter gemacht ist, dass diese Daten nur eine Teilmenge der Spalten sind, und ich brauche nur auf einer Untergruppe von Namen übereinstimmen.

Antwort

1

Wir brauchen den Zeilenindex mit dem Spaltenindex entlang der Elemente aus dem Datensatz

ds$wanted <- ds[-5][cbind(1:nrow(ds), match(ds$bestfit, names(ds)[-5]))] 
ds$wanted 
#[1]   NA 0.10553030 -0.06537934 -3.17000060   NA 
+0

Was zu extrahieren, wenn ich nur an den Spalten 5 übereinstimmen bin versucht: 8 für Werte in bestfit? – akaDrHouse

+1

@akaDrHouse THen müssen Sie die 'Namen (ds) [5: 8]' und 'ds [5: 8]' – akrun

+1

Vielen Dank, das ist großartig. Ich habe nicht erkannt, dass [Wert] ohne Komma zum Trennen von Zeilen vs. Spalten als Spalten voreingestellt ist. Ist mein Verständnis richtig? – akaDrHouse