【问题标题】:Using Plyr in R with a complex function that returns multiple variable在 R 中将 Plyr 与返回多个变量的复杂函数一起使用
【发布时间】:2011-09-08 05:04:10
【问题描述】:

我有一个包含三个分组变量的数据集:条件、子和延迟。这是我的数据的简化版本(真实数据要长得多)

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(data,.(sub,condition,delay),getIndiffs)

但是,当我运行它时,我得到了错误

list_to_dataframe(res, attr(.data, "split_labels")) 中的错误: 结果长度不相等

奇怪的是,当我只使用 1 个分组变量但用 2+ 抛出错误时,这工作正常

此外,当我自己“模拟”将数据集拆分为仅包含由 3 个分组变量拆分的子集的数据集时,我的函数工作得很好。 (注意:我尝试了返回 3 个变量甚至只返回 1 个变量的不同方法,但它也不起作用)

基本上我想知道的是如何使用plyr来使用函数返回多个变量。

我的问题的任何其他根本不同的解决方案也是受欢迎的。

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    当我的函数应用于我的一个片段返回一个空数据框时,我通常会发生该错误。在任何情况下,调试情况的一种简单方法是使用 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)放在最后一个}之后(并用另一个}结束你的函数)。

    【讨论】:

    • 啊!谢谢你。看起来它可能归结为一个愚蠢的错字,但这是一个有用的调试技巧
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多