使用R(或可能是Excel)组合数据 - 循环以匹配刺激

时间:2015-06-09 16:16:41

标签: r excel nested-loops lookup

我有两组数据,它们对应于我想要合并进行分析的不同实验任务。问题是我需要搜索和匹配特定行的特定行和特定参与者。我想用脚本来省去一些麻烦。这可能很简单,但我以前从未这样做过。

这里更具体地说明了我的问题: 在第一个数据集中,每行对应一个两个替代的强制选择任务,其中一次呈现两个刺激并且参与者选择一个。在第二个数据集中,每行对应于单个项目任务,其中询问参与者他们之前是否曾见过刺激。第二个任务中的刺激与第一个任务中的对中的刺激相匹配(两倍的行)。我希望能够匹配并向第一个数据集添加两列 - 一个用于说明LEftide项目是否稍后被识别,另一个用于右侧刺激。

我认为这可以通过嵌套循环完成,但我不确定是否有一种优雅的方式来执行此操作或者可能是一个包。

1 个答案:

答案 0 :(得分:0)

据我了解,您的第一个数据集看起来像这样:

(dat1 <- data.frame(person=1:2, stim1=1:2, stim2=3:4))
#   person stim1 stim2
# 1      1     1     3
# 2      2     2     4

这意味着人1获得刺激1和3,而人2获得刺激2和4.然后你的第二个数据集看起来像这样:

(dat2 <- data.frame(person=c(1, 1, 2, 2), stim=c(1, 3, 4, 2), responded=c(0, 1, 0, 1)))
#   person stim responded
# 1      1    1         0
# 2      1    3         1
# 3      2    4         0
# 4      2    2         1

这提供了有关每个人如何对每项刺激做出回应的信息。

您可以通过将人/刺激对与match函数匹配来合并这两者:

dat1$response1 <- dat2$responded[match(paste(dat1$person, dat1$stim1), paste(dat2$person, dat2$stim))]
dat1$response2 <- dat2$responded[match(paste(dat1$person, dat1$stim2), paste(dat2$person, dat2$stim))]
dat1
#   person stim1 stim2 response1 response2
# 1      1     1     3         0         1
# 2      2     2     4         1         0

另一个选项(从原始dat1dat2开始)将与merge函数合并两次。您对输出列的名称控制较少,但它需要少一点输入:

merged <- merge(dat1, dat2, by.x=c("person", "stim1"), by.y=c("person", "stim"))
merged <- merge(merged, dat2, by.x=c("person", "stim2"), by.y=c("person", "stim"))