看一下我从一个有很多试验的任务中得到的数据,每个试验包含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),指示1个或多个问题不正确。为了实现这一目标,我竭尽全力将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

谢谢!

最佳答案

我能想到的最简单的方法是使用mutate,它是plyrtransform的变体

 alloktest<-ddply(.data=data,c("Subject","trial"), mutate,
     aok = sum(accuracy) == length(accuracy))

假设在每个主题和试验组合中,每个问题只有1行。

关于r - 我如何将ddply与自定义函数一起使用并返回原始数据帧以及结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15488614/

10-12 16:32
查看更多