ddply不返回按变量分割的函数的值

时间:2015-02-11 16:52:57

标签: r plyr

我使用ddply函数(plyr)按参与者ID( pid )分别计算某些内容。但是,由于某种原因,它不会通过 pid 返回单独的值,而是在所有 pid 中返回相同的值。

示例数据:

sdt<-c("Hit","Hit","Miss","Miss","False Alarm","Correct Reject","Correct Reject","Correct Reject",
   "Hit","Hit","Hit","Miss","False Alarm","False Alarm","False ALarm","Correct Reject")

pid<-c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)

adhd_p<-data.frame(sdt,pid)

功能:

ddply(adhd_p, "pid", summarise,
  hitrate=(count(adhd_p$sdt=="Hit")[[2,2]])/((count(adhd_perf$sdt=="Hit")[[2,2]])+(count(adhd_p$sdt=="Miss")[[2,2]])),
  falsealarmrate=(count(adhd_p$sdt=="False Alarm")[[2,2]])/((count(adhd_p$sdt=="False Alarm")[[2,2]])+(count(adhd_p$sdt=="Correct Reject")[[2,2]])))

如果有助于理解我正在计算的内容......参与者可以&#34;点击&#34; (肯定地回应目标),&#34;小姐&#34; (不回应目标),&#34;正确拒绝&#34; (不要对干扰者做出反应),或者&#34;误报&#34; (肯定地回应干扰者)。因此,&#34;击中&#34;是命中/命中+未命中数,&#34; falsealarmrate&#34;是错误警报/错误警报+正确拒绝的数量。

我做错了什么?

感谢您的时间。

编辑:编辑代码

可以很快解决上述问题
 ddply(adhd_p, "pid", summarise,
  hitrate=(count(sdt=="Hit")[[2,2]])/((count(sdt=="Hit")[[2,2]])+(count(sdt=="Miss")[[2,2]])),
  falsealarmrate=(count(sdt=="False Alarm")[[2,2]])/((count(sdt=="False Alarm")[[2,2]])+(count(adhd_p$sdt=="Correct Reject")[[2,2]])))

我现在意识到我需要分割两个变量而不是一个变量。但是添加时间变量:

time<-c(1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8)

将其与其他人合并

adhd_p<-data.frame(sdt,pid,time)

使新脚本生成一个超出范围的&#34;下标&#34;错误。

ddply(adhd_p, .(pid,time), summarise,
  hitrate=(count(sdt=="Hit")[[2,2]])/((count(sdt=="Hit")[[2,2]])+(count(sdt=="Miss")[[2,2]])),
  falsealarmrate=(count(sdt=="False Alarm")[[2,2]])/((count(sdt=="False Alarm")[[2,2]])+(count(sdt=="Correct Reject")[[2,2]])))

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你需要做什么:

ddply(adhd_p, "pid", summarise,
  hitrate=(count(sdt=="Hit")[[2,2]])/((count(sdt=="Hit")[[2,2]])+(count(sdt=="Miss")[[2,2]])),
  falsealarmrate=(count(sdt=="False Alarm")[[2,2]])/((count(sdt=="False Alarm")[[2,2]])+(count(sdt=="Correct Reject")[[2,2]])))

为什么你需要这样做:

当您调用ddply时,该函数在.data(在您的情况下为adhd_p)内作为本地命名空间。这类似于调用attach(adhd_p);调用列的名称而不显式引用数据框仍会调用正确的列。

当您提供summarise参数时,该函数会根据提供的id列(在本例中为pid)拆分本地名称空间中的向量。因此,如果您在没有明确引用数据框的情况下引用列,则会使用与sdt对应的pid列部分进行计算。但是,如果您明确引用列和数据框(在您的情况下为adhd_p$sdt),它只会从全局命名空间中提取整个向量,并且不会对其进行适当拆分。

编辑:下面的代码不那么混乱,如果缺少其中一个值,则不会引发错误:

ddply(adhd_p, .(pid, time), summarise,
      hitrate=(sum(sdt=="Hit"))/(sum(sdt=="Hit"))+(sum(sdt=="Miss")),
      falsealarmrate=(sum(sdt=="False Alarm"))/(sum(sdt=="False Alarm"))+(sum(sdt=="Correct Reject")))

答案 1 :(得分:1)

我没有深入研究为什么你所做的事情是错的,但这里有一个可能有帮助的答案:

ddply(
  adhd_p, "pid", summarize, 
  hitrate=sum(sdt == "Hit") / sum(sdt %in% c("Hit", "Miss")),
  falsealarmrate=sum(sdt == "False Alarm") / sum(sdt %in% c("False Alarm", "Correct Reject"))
)

产地:

  pid hitrate falsealarmrate
1   1    0.50      0.2500000
2   2    0.75      0.6666667