2016-05-03 64 views
1

我正在尝试查找与参与者实验相关的值,并将他们添加到每个参与者参与每个实验中。R匹配列名称和拉值

如果参与者在A列中有1,这意味着他们暴露于实验A.然后我想拉入与实验A相关的3个值,并且在每个参与者的每次实验暴露中开始累加这些值。

DF:

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

我的查询数据帧:

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

对于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 

我的真实数据集具有实验64分的情况下,7000人参加。我的这是什么看起来像速记是:

对于每一行, 对于每一列,

如果列i = 1,比赛COLUMNNAME查找$实验

添加VAL1:在VAL3临时阵列

然后临时数组粘贴到DF

任何帮助,将不胜感激!我不确定这是匹配还是合并功能。

数据

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") 

回答

4

你所描述的矩阵乘法。处理ParticipantExperiment列作为行标签(和要求那的df实验列是相同的顺序作为查找表的行):

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

第二行可能是'cbind(DF [1 ],结果)' – Frank