2017-07-10 1 views
1

Ich muss einige einfache Operationen auf wenige Vektoren und Zeilen durchführen.R: Operationen auf Vektoren mit verschiedenen Suffixen anwenden

sei angenommen, dass ich eine Datenbank haben, wie:

observation  outcome_1_a outcome_2_a outcome_1_b outcome_2_b choice_a choice_b 
1    41   34   56   19   1  1 
2    32   78   43   6   2  1 
3    39   19   18   55   1  2 

für jede Beobachtung, outcome_1 und outcome_2 sind die zwei mögliche Ergebnisse, ist Wahl der gewählte Ausgang und das Präfix _i, mit i a, b =, gibt an, wie oft die Situation wiederholt wird.

Wenn ich will, Variablen erstellen die höchste Ergebnis für jede Situation Speicherung (a, b), also:

max.a <- pmax(data$outcome_1_a, data$outcome_2_a) 
max.b <- pmax(data$outcome_1_b, data$outcome_2_b) 

Und falls ich Variablen erstellt werden soll, die Werte in jeder Situation gewählt Speicherung kann ich tun:

choice.a <- ifelse(data$choice_a == "1", data$outcome_1_a, data$outcome_1_b) 
choice.b <- ifelse(data$choice_b == "1", data$outcome_2_a, data$outcome_2_b) 

Schließlich Wenn ich die mittlere Zeile der Situationen berechnen möchte a und b, kann ich tun:

library(data.table) 
setDT(data) 
data[, .(Mean = rowMeans(.SD)), by = observation, .SDcols = c("outcome_1_a","outcome_2_a", "outcome_1_b", "outcome_2_b")] 

Nun, alle diese funktionieren gut. Ich habe mich jedoch gefragt, ob solche Operationen effizienter durchgeführt werden können.

Im Beispiel gibt es nur wenige sind Situationen, aber, wenn ich in Zukunft mit zu tun haben werde, sagen wir mal, 15 oder mehr unterschiedliche Situationen (a, b, c, d, ...,), das Schreiben solcher Operationen könnte ärgerlich sein.

Gibt es eine Möglichkeit, einen solchen Prozess basierend auf den verschiedenen Präfixen und/oder Suffixen der Variablen zu automatisieren?

Vielen Dank für Ihre Hilfe

Antwort

1

Sie Spalten mit einigen regex auswählen können. Zum Beispiel, um Ihren max.a Wert zu erhalten.

library(data.table) 

setDT(data) 
data[, do.call(pmax, .SD), .SDcols = names(data) %like% "\\d+_a$"] 

[1] 41 78 39 

Alternativ können Sie Ihre Spalten mit einigen regex wählen außerhalb des data.table. Viele Möglichkeiten, dies zu tun.

Ähnliche Anwendung zu Ihrem letzten Befehl.

data[, 
    .(Mean = rowMeans(.SD)), 
    by = observation, 
    .SDcols = names(data) %like% "^outcome"] 
    observation Mean 
1:   1 37.50 
2:   2 39.75 
3:   3 32.75 

Für choice.a, wie Sie zwischen b wählen würde, c, d, e etc?

+0

Danke Eric. Ihr Code funktioniert hervorragend im 'RowMeans'-Fall. Aber (Entschuldigung, wenn ich etwas funktioniere), im Falle des Paares max by spalte den Prozess nicht automatisieren: das heißt, 'data schreiben [, do.call (pmax, .SD), .SDcols = Namen (Daten)% like% "\\ d + _a $"] 'gibt mir die gleiche Ausgabe wie' pmax (data $ outcome_1_a, data $ outcome_2_a) '. Ich muss den Brief immer noch manuell im 'SDcols' -Argument ändern –

1

Zum Beispiel:

outcome_1_a outcome_2_a outcome_1_b outcome_2_b outcome_1_c outcome_2_c outcome_1_d outcome_2_d outcome_1_e outcome_2_e choice_a choice_b choice_c choice_d choice_e 
     <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1   12   85   32   28   91   42   32   96   27   29  2  1  1  1  1 
2   17   22   84   53   11   69   16   66   11   41  1  2  2  1  1 
3   92   98   76   83   18   27   21   51   92   41  1  1  1  1  2 
4   63   49   61   64   100   28   43   51   22   94  1  2  1  1  1 

eine Indexvariable definieren, die Sie durch die Schlaufen gehen helfen:

seqmax <- seq(1, 10, by = 2) 

seqmax ist ein 1 3 5 7 9. Der Grund dafür ist, dass es 5 Buchstaben "a" "b" "c" "d" "e" gibt. Diese Sequenz wird Ihnen helfen, die Schleife zu strukturieren. Dies kann für die maximale Anzahl von Buchstaben automatisiert werden, suchen Sie einfach den Spaltenindex für die letzte Spalte vor choice_a. Dann können Sie seq(1, grep(names(data), pattern = "choice_a") - 1, by = 2) tun.Das Argument by = 2 kann für die Anzahl der Spalten nach Buchstaben angepasst werden.

Ich verwende lapply mit <<-, um die neue Spalte zu data zuzuweisen.

lapply(c(1:5), function(x){ 

    data[, paste0("max.", letters[x])] <<- apply(data[, c(seqmax[x], seqmax[x] + 1)], 1, max) 

    data[, paste0("choice.", letters[x])] <<- ifelse(
    data[, grep(names(data), pattern = paste0("choice_", letters[x]), value = T)] == 1, 
    data[, seqmax[x]], data[, seqmax[x] + 1]) 

    data[, paste0("mean.", letters[x])] <<- rowMeans(
    data[, grep(names(data), pattern = paste0("outcome_\\d+_", letters[x]), value = T)]) 

}) 
Verwandte Themen