Festlegen des Spaltenwerts aus einer Sammlung anderer Spalten, die von einer Auswahlspalte zeilenweise ausgewählt wurden (Durchführen einer Suche)

Betrachten Sie den folgenden Datenrahmen:

TEST <- structure(list(Value = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), 
  Select = structure(c(2L, 1L, 3L, 2L, 2L, 1L, 1L,
  2L, 1L, 1L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"),
  A = c(5L, 5L, 4L, 3L, 4L, 3L, 5L, 3L, 3L, 4L, 5L, 4L), 
  B = c(10L, 8L, 7L, 6L, 3L, 8L, 8L, 7L, 8L, 9L, 11L, 8L), 
  C = c(0L, 1L, 3L, 2L, 0L, 3L, 0L, 2L, 0L, 1L, 1L, 0L)), 
  .Names = c("Value", "Select", "A", "B", "C"), 
  row.names = c(NA, -12L), 
  class = "data.frame")

Ich möchte die Spalte "Wert" effizient zeilenweise aus dem Satz der Spalten A, B und C basierend auf der Spalte "Auswählen" zuweisen.

In Zeile 1 möchte ich zum Beispiel, dass Value gleich dem Element in Spalte B ist - d. H. Value [1] = 10.

Meine derzeitige Methode ist die Verwendung einer for-Schleife:

for( idx in 1:nrow(TEST) ) {
  TEST$Value[idx] <- TEST[ idx, as.character(TEST$Select[idx]) ]
}

Was zur gewünschten Ausgabe führt:

    Value Select A  B C
 1     10      B 5 10 0
 2      5      A 5  8 1
 3      3      C 4  7 3
 4      6      B 3  6 2
 5      3      B 4  3 0
 6      3      A 3  8 3
 7      5      A 5  8 0
 8      7      B 3  7 2
 9      3      A 3  8 0
 10     4      A 4  9 1
 11     1      C 5 11 1
 12     0      C 4  8 0

Gibt es eine effizientere oder alternative Möglichkeit, dies zu tun? Ich denke, das ist eine Art Merge () - oder Tabellen-Join-Operation.

P.S. Ich war mir nicht ganz sicher, wie ich diesen Vorgang beschreiben sollte - Vorschläge für eine bessere Frage / Beschreibung sind ebenfalls willkommen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage