我有一个包含三个分组变量的数据集:condition,sub和delay.这是我的数据的简化版本(实际数据更长)
Run Code Online (Sandbox Code Playgroud)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)
}
Run Code Online (Sandbox Code Playgroud)
我试图使用ddply将它应用于每个3个分组变量的每个数据子集:
ddply(数据,.(分,条件,延迟),getIndiffs)
但是,当我运行这个时,我得到了错误
list_to_dataframe中的错误(res,attr(.data,"split_labels")):结果的长度不相等
奇怪的是,当我只使用1个分组变量但是将错误抛出2+时,这个工作正常
此外,当我"模拟"将数据集本身拆分为仅包含由3个分组变量分割的子集的数据drame时,我的函数工作得很好.(注意:我尝试了不同的方法来返回3个变量,甚至只返回1个变量,它也不起作用)
基本上,我想知道的是如何使用plyr来使用函数来返回多个变量.
我的问题的任何其他根本不同的解决方案也是受欢迎的.
当我的函数应用于我的一个部分返回一个空数据框时,这个错误通常发生在我身上.在任何情况下,调试情况的简单方法是使用dlply而不是ddply,并检查输出; 例如
x <- dlply(data,.(sub,condition,delay),getIndiffs)
sapply(x,ncol)
Run Code Online (Sandbox Code Playgroud)
检查它们是否都具有相同的列数.如果没有,请更多地标准化您的功能.
看起来您的函数getIndiffs设计为在单行上运行,而不是在整个数据帧上运行. d*ply(x,vars,fn)手中fn()的整个数据框由与该组匹配的观察子集组成.同样,函数可以在三个不同的地方返回 - 在每个条件子句的末尾.我认为你打算放在c(indiff,p_intercept,p_lv)最后一个}(并用另一个结束你的功能}).