2015-02-11 48 views
1

我使用ddply函數(plyr)根據參與者ID(pid)分別計算某些東西。但是,由於某種原因,它不會通過pid返回單獨的值,而是在所有pid中都具有相同的值。ddply不返回函數按變量分割的值

的樣本數據:

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]]))) 

如果它有助於瞭解我計算...參與者可以 「打」(肯定響應的目標),「小姐「(不要回應目標),」正確拒絕「(不要回應干擾),或」錯誤警報「(肯定地迴應干擾)。因此,「hitrate」是命中/命中+未命中的次數,「falsealarmrate」是錯誤警報/錯誤警報+正確拒絕的次數。

我在做什麼錯?

謝謝你的時間。

編輯:上面的問題很快就解決了通過修改代碼來

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) 

合併它使新的腳本產生一個「下標越界」的錯誤。

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

你需要做什麼:

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時,該功能在您的案例中作爲本地名稱空間在.dataadhd_p)內工作。這與調用attach(adhd_p)相似;在不明確引用數據框的情況下調用列的名稱仍會調用正確的列。

當您提供參數summarise時,函數根據提供的id列(本例中爲pid)在本地名稱空間中分割向量。因此,如果您沒有像上面那樣明確引用數據框來引用列,則將使用對應於每個pidsdt列的部分來完成計算。但是,如果您明確引用了列和數據框(在您的案例中爲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"))) 
+0

太棒了,謝謝你的解釋!它有助於讓它像這樣拼寫出來。 – smgmu 2015-02-11 17:18:30

+0

作爲一個後續問題,我將如何重複上述過程,但是會被第二個變量分割(例如,如果每個參與者都有一個「時間」變量)?我嘗試將「pid」更改爲c(「pid」,「time」),但它返回錯誤:「Error:subscript out of bounds」 – smgmu 2015-02-11 17:49:15

+0

'.variables'參數可以接受一個向量,所以可以使用'ddply (adhd_p,c(「pid」,「time」),...)'。這將生成數據幀中找到的每個組合(時間1的pid 1,時間2的pid 1,時間1的pid 2等)。 – Joe 2015-02-11 17:57:07

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 
+0

的關鍵似乎是去除明確提到數據幀(adhd_p $ SDT )是問題的關鍵。謝謝。 – smgmu 2015-02-11 17:19:16