for循环,列表列表和条件分析(在R中)

时间:2015-07-10 19:56:17

标签: r for-loop dataframe

我正在尝试计算实验中每个受试者的反应时间分数,但仅使用一部分试验,这取决于受试者的表现。

每位受试者对16项进行了测验。然后他们对相同的16个项目进行了测试。对于每个主题,我想得到平均反应时间得分,但仅针对那些他们同时获得测验和测试问题的项目

我的数据文件如下所示:

subject   quizitem1   quizitem2   testitem1   testitem2   RT1   RT2
1         1           0           1           1           5     10
2         0           1           0           1           3     7

理想情况下,我想要另一列代表每个主题的平均反应时间,仅考虑iquizitem[i]下只有1的项目testitem[i]的RT。要使用上面的示例,列将如下所示:

newDV
5
7

...因为主题1在两个指标上只得到第1项正确,而主题2在两个指标上只得到第2项正确。

我首先制作了三个向量,以帮助以正确的顺序保存相关项目的数据。

quizacclist = c(quizitem1, quizitem2)
testacclist = c(testitem1, testitem2)
RTlist = c(RT1, RT2)

这些新向量中的每一个都很长,将所有主题的RT1附加到所有主题的RT2,依此类推。

我尝试使用for循环计算此列,但无法确定将分析限制为符合上述条件的项目所需的条件。

这是我的尝试:

attach(df)
i = 0
j = 0

for(i in subject) {
    for(j in 1:16) {
        denominator[i] = sum(quizacclist[i*j]==1 & testacclist[i*j]==1)
        qualifiedindex[i] = ??
        numerator[i] = sum(RTlist[qualifiedindex])
        meanqualifiedRT[i] = numerator[i]/denominator[i] 
        }
    }

denominator变量应该计算主题让测验和测试问题都正确的项目数。

numerator变量应该为有助于denominator变量的项目添加所有RT;也就是说,测验和测试问题对于该项目是正确的。

此时我的具体问题是:如何指定此qualifiedindex?正如我所设想的那样,它应该是一份清单清单;宏列表中的每个索引都对应一个主题,每个主题都有一个自己的列表,用于确定哪个项目在1quizacclist[i]下都有testacclist[i]个。

例如:

Qualifiedindex = ([1,5,9],[2,6],[8,16],etc)

理想情况下,此结构允许numerator变量仅添加满足精度条件的RT。

如何创建列表中的列表? 或者,有没有更好的方法来实现我的目标? 任何帮助将不胜感激!

提前致谢, 亚当

2 个答案:

答案 0 :(得分:0)

以下是使用基础R reshape然后dplyr

的解决方案
quiz_long <- reshape(quiz, direction = "long",
  varying = -1, sep = "", idvar = "subject",
  timevar = "question")
quiz_long %>%
  filter(quizitem == 1 & testitem == 1) %>%
  group_by(subject) %>%
  summarise(mean(RT))

请注意,这只包含至少有一个可用问题的主题。对这些科目有NA的替代方案:

quiz_long %>%
  mutate(RT = replace(RT, quizitem != 1 | testitem != 1, NA)) %>%
  group_by(subject) %>%
  summarise(mean_RT = mean(RT, na.rm = TRUE))

答案 1 :(得分:0)

感谢尼克提出的有希望的建议!我已经试过了,但目前卡在处理由mutate功能提示的错误,其中替换的行数与数据不同。出现这种情况的常见原因是什么?

再次感谢, 亚当