我使用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]])))
有什么想法吗?
答案 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