2016-10-04 2 views
1

Ich habe ein data.frame wie folgt aufgebaut:R Fund Zeilenwert auf Wert in einer anderen Spalte basiert, ohne ifelse

a b c d column_name 
1 2 3 4 a 
2 3 4 1 b 
3 4 1 2 c 
4 1 2 3 d 

Jetzt möchte ich den Wert für jede Zeile erhalten, der Spalte, die den Namen übereinstimmt in Spaltenname. Ich baue dies mit einer ifelse etwa so:

df$value <- ifelse(df$column_name=="a", df$a, 
ifelse(df$column_name=="b", df$b, 
ifelse(df$column_name=="c", df$c, 
ifelse(df$column_name=="d", df$d, "NA")))) 

jedoch nicht sehr hübsch und effizient ist. Bei mehr als 4 möglichen Spalten ist es unmöglich zu verwenden.

Kennt jemand einen effizienteren und schönen Weg? Ich versuchte apply(), aber konnte es nicht zur Arbeit bringen.

Antwort

2

Wir können einen Spaltenindex von match ing der ‚Spalten_Name‘ mit den Spaltennamen des Datensatzes (match(df$column_name, colnames(df))), cbind es mit dem Zeilenindex (1:nrow(df)) erstellen, extrahieren die Elemente der ‚df‘ basierend auf dieser und zuweisen (<-), um die Spalte 'Wert' zu erstellen.

df$value <- df[-ncol(df)][cbind(1:nrow(df), match(df$column_name, colnames(df)))] 
df$value 
#[1] 1 3 1 3 
+1

Vielen Dank für die schnelle und klare Erklärung! – Jesse

Verwandte Themen