从具有多个试验的任务中查看我的数据,每个试验包含5个问题(以下代码将生成代表性子集):
Subject<-c(rep(400,20),rep(401,20))
RT<-sample(x=seq(250:850),size=40)
accuracy<-c(1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0)
trial<-rep(rep(1:4, each=5),2)
question<-rep(seq(from=0,to=4),8)
data<-data.frame(Subject,trial,question,RT,accuracy)
remove(Subject,RT,accuracy,trial,question)
并且看起来像这样:
ID trial question RT accuracy
1 400 1 0 131 1
2 400 1 1 768 1
3 400 1 2 300 1
4 400 1 3 130 1
5 400 1 4 168 1
...
36 401 1 0 273 1
37 401 1 1 803 1
38 401 1 2 786 0
39 401 1 3 712 1
40 401 1 4 254 0
现有的准确性变量是指每个问题的准确性。我正在尝试创建一个新变量,它基本上表明特定试验中的所有问题是否正确(即准确度= 1)。对于上面的主题400,结果变量将是c(1,1,1,1,1),表明所有问题都是正确的。对于上面的主题401,结果数据将是c(0,0,0,0,0),表明一个或多个问题是不正确的。为实现这一目标,我尽力解决Plyr及其变体的相当混乱的帮助文件和示例,以提出这个解决方案:
逻辑: 1)对于每个受试者,分别考虑每个试验中的问题 2)查看传递数据帧的精度列 2)如果在试验中精度总和为问题数,则返回所有1的向量,否则返回所有0的向量
这似乎完成了工作:
allOK<-function(x) {
c<-length(x[,1]) #get number of questions for this trial
s<-sum(x$accuracy) #get sum of accuracies
return ( data.frame(rep(as.integer(s==c))) ) #return allOK vector
}
这是我尝试将其应用于我的数据:
alloktest<-ddply(.data=data,c("Subject","trial"), .fun=allOK, .progress = "text")
它有效,除了alloktest只包含Subject,trial和带有结果的新变量。虽然结果是正确的,但很好,但我希望它能用新的变量返回原始数据框(可能名为aok)。
我如何实现这一目标?要清楚,我正在寻找这个:
ID trial question RT accuracy aok
1 400 1 0 131 1 1
2 400 1 1 768 1 1
3 400 1 2 300 1 1
4 400 1 3 130 1 1
5 400 1 4 168 1 1
...
36 401 1 0 273 1 0
37 401 1 1 803 1 0
38 401 1 2 786 0 0
39 401 1 3 712 1 0
40 401 1 4 254 0 0
谢谢!
答案 0 :(得分:4)
我能想到的最简单的方法是使用mutate
,这是[{1}}
plyr
变体
transform
这假定在每个主题和&amp;试用组合,每个问题只有一行。