Использование Plyr в R со сложной функцией, которая возвращает несколько переменных - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть набор данных с тремя группирующими переменными: условие, подпрограмма и задержка. Вот упрощенная версия моих данных (реальные данные намного длиннее)

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 (.data, "split_labels")): Результаты не имеют одинаковую длину

Странно, это нормально работает, когда я использую только 1 группирующую переменную, но выдает ошибку с 2 +

Кроме того, когда я сам "имитирую" разбиение набора данных на драму данных, содержащую только подмножество, разделенное на 3 группирующие переменные, моя функция работает просто отлично. (Примечание: я пробовал разные способы вернуть 3 переменные или даже вернуть только 1 переменную, и она тоже не работает)

По сути, я хочу знать, как использовать plyr для использования функции, возвращающей несколько переменных.

Любые другие решения моей проблемы, которые принципиально отличаются, также приветствуются.

1 Ответ

7 голосов
/ 08 сентября 2011

Эта ошибка обычно происходит со мной, когда моя функция, примененная к одной из моих частей, возвращает пустой фрейм данных. В любом случае, простой способ отладить ситуацию - использовать 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) после последнего } (и завершить свою функцию другим }).

...