2011-09-08 47 views
0

我有一個數據集有三個分組變量:condition,sub,& delay。這是我的數據的簡化版本(實際數據是更長的時間)在R中使用Plyr與一個複雜的函數,返回多個變量

sub condition delay later_value choiceRT later_choice primeRT  cue 
10  SIZE 10   27  1832   1  888  CHILD 
10  PAST  5   11  298   0 1635  PANTS 
10  SIZE 21   13  456   0  949  CANDY 
11  SIZE 120   22  526   1 7963  BOY 
11 FUTURE 120   27  561   1 4389 CHILDREN 
11  PAST  5   13  561   1 2586  SPRING 

我有一組複雜的程序,適用於這些數據(細節並不重要) 我寫了下面的功能當由三個分組變量分割時,完成我想要的內容。它返回3個變量是我感興趣的(indiff,p_intercept,& p_lv)

getIndiffs <- function(currdelay){ 
     if (mean(currdelay$later_choice) == 1) { 
     indiff = 10.5 
     p_intercept = "laters" 
     p_lv = "laters" 
     } 

     else if (mean(currdelay$later_choice) == 0) { 
     indiff = 30.5 

     # no p-val here, code that this was not calculated 
     p_intercept = "nows" 
     p_lv = "nows" 
     } 

     else { 
     F <- factor(currdelay$later_choice) 

     fit <- glm(F~later_value,data=currdelay,family=binomial()) 
     indiff <- -coef(fit)[1]/coef(fit)[2] 

     if (indiff < 10) indiff = 10.5 
     else if (indiff > 30) indiff = 30.5 

     p_intercept = round(summary(fit)$coef[, "Pr(>|z|)"][1],3) 
     p_lv = round(summary(fit)$coef[, "Pr(>|z|)"][2], 3) 
     c(indiff,p_intercept,p_lv) 
     } 

我試圖用ddply將其應用到每3個分組變量數據的每個子集:

ddply(數據。(子,條件,延遲),getIndiffs)

然而,當我運行此我得到的錯誤

錯誤list_to_dataframe(RES,ATTR(。數據「split_labels」)): 結果不具有相等的長度

奇怪的是,當我只用1分組變量這個工作正常,但投用2錯誤+

此外,當我「模擬」將數據集自己拆分爲只包含由3個分組變量分割的子集的數據drame時,我的函數工作得很好。 (注:我已經嘗試了不同的方式返回3個變量,甚至只返回1個變量,但它也不起作用)

基本上,我想知道的是如何使用plyr來使用函數返回多個變量。

對我的問題有任何其他解決方案也是根本不同的,也是值得歡迎的。

回答

7

這個錯誤通常發生在我身上時,我的函數應用於我的一個片段返回一個空的數據框。在任何情況下,調試情況的簡單方法是使用dlply而不是ddply,然後檢查輸出;例如

x <- dlply(data,.(sub,condition,delay),getIndiffs) 
sapply(x,ncol) 

檢查它們都具有相同的列數。如果不是,則更多地標準化您的功能。

它看起來像你的功能getIndiffs被設計爲運行在一行上,而不是在整個數據幀上運行。 d*ply(x,vars,fn)fn()整個數據框由與該組匹配的觀察子集組成。嗯,此外,函數可以返回三個不同的地方 - 在每個條件子句的末尾。我認爲你的意思是在最後的}之後輸入c(indiff,p_intercept,p_lv)(並且用另一個}結束你的功能)。

+0

啊!謝謝。看起來它可能已經歸結爲一個愚蠢的錯字,但這是一個有用的調試技巧 –

相關問題