0

条件、サブ、および遅延の 3 つのグループ化変数を持つデータ セットがあります。これは私のデータの簡略化されたバージョンです(実際のデータはもっと長いです)

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 つのグループ化変数で分割すると、目的を達成する次の関数を作成しました。興味のある 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を使用して関数を使用して複数の変数を返す方法です。

根本的に異なる私の問題に対する他の解決策も大歓迎です。

4

1 に答える 1

7

このエラーは通常、自分の関数が自分のピースの 1 つに適用されて空のデータ フレームが返されたときに発生します。いずれにせよ、状況をデバッグする簡単な方法はdlply、ddply の代わりに使用し、出力を調べることです。例えば

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

それらがすべて同じ数の列を持っていることを確認します。そうでない場合は、関数をさらに標準化してください。

関数getIndiffsは、データフレーム全体ではなく、単一の行で実行するように設計されているようです。 そのグループに一致する観測のサブセットで構成されるデータ フレーム全体d*ply(x,vars,fn)を渡します。また、関数は 3 つの異なる場所 (各条件節の最後) で戻ることができます。最後の後に置くつもりだったと思います(そして、別の関数で終了します)。fn()c(indiff,p_intercept,p_lv)}}

于 2011-09-08T05:30:24.593 に答える