2016-05-03 7 views
1

Ich versuche, die Werte zu einem Teilnehmer Experiment suchen und summieren sie für die Teilnahme jedes Teilnehmers in jedem Experiment.R Übereinstimmung Spaltenname und Pull-Werte

Wenn der Teilnehmer eine 1 in Spalte A hat, bedeutet dies, dass sie Experiment A ausgesetzt waren. Ich möchte dann die 3 Werte von Experiment A abrufen und die Werte für jede Experimentexposition für jeden Teilnehmer summieren.

df:

Participant A B 
1  1 1 
2  1 0 
3  0 1 

Mein Lookup Datenrahmen:

Experiment Val1 Val2 Val3 
A  1.1 1.2 1.3 
B  1.0 1.1 1.5 

Für eine Folge von df:

Id A B Val1 Val2 Val3 
1  1 1 2.1 2.3 2.8 
2  1 0 1.1 1.2 1.3 
3  0 1 1.0 1.1 1.5 

Mein wahren Daten-Set hat 64 Fälle von Experimenten mit 7.000 Teilnehmern.

Für jede Zeile Für jede Spalte

Wenn Spalt i = 1, Spiel column $ Experiment zum Nachschlagen

Val1 hinzufügen: Meine Stenografie, was diese aussehen würde, aussehen würden Val3 in einem

Temp Array

dann fügen Temp Array in df

Jede mögliche Hilfe würde geschätzt! Ich bin mir nicht sicher, ob dies eine Match- oder Merge-Funktion ist.

Daten

df = structure(list(Participant = 1:3, A = c(1L, 1L, 0L), B = c(1L, 
0L, 1L)), .Names = c("Participant", "A", "B"), row.names = c(NA, 
-3L), class = "data.frame") 
lookup = structure(list(Experiment = c("A", "B"), Val1 = c(1.1, 1), Val2 = c(1.2, 
1.1), Val3 = c(1.3, 1.5)), .Names = c("Experiment", "Val1", "Val2", 
"Val3"), row.names = c(NA, -2L), class = "data.frame") 

Antwort

4

Sie beschreiben Matrixmultiplikation. Die Behandlung der Participant und Experiment Spalte als Zeilenbeschriftungen (und erfordern, dass die Experiment Spalten df in der gleichen Reihenfolge wie die Zeilen der Lookup-Tabelle) sind:

result = as.matrix(df[, -1]) %*% as.matrix(lookup[, -1]) 
result = cbind(df[1], result) 
result 
# Participant Val1 Val2 Val3 
# 1   1 2.1 2.3 2.8 
# 2   2 1.1 1.2 1.3 
# 3   3 1.0 1.1 1.5 
+2

Zweite Linie sein könnte 'cbind (df [1 ], Ergebnis) ' – Frank