5

それぞれが 5 つの質問で構成されている多くの試行を伴うタスクからの私のデータを見てください (次のコードは代表的なサブセットを生成します)。

Subject<-c(rep(400,20),rep(401,20))
RT<-sample(x=seq(250:850),size=40)
accuracy<-c(1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0)
trial<-rep(rep(1:4, each=5),2)
question<-rep(seq(from=0,to=4),8)
data<-data.frame(Subject,trial,question,RT,accuracy)
remove(Subject,RT,accuracy,trial,question)

次のようになります。

      ID    trial  question   RT   accuracy
1     400   1      0          131  1
2     400   1      1          768  1
3     400   1      2          300  1
4     400   1      3          130  1
5     400   1      4          168  1
...
36    401   1      0          273  1
37    401   1      1          803  1
38    401   1      2          786  0
39    401   1      3          712  1
40    401   1      4          254  0

既存の精度変数は、各質問の精度を参照します。特定のトライアルのすべての質問が正しいかどうかを本質的に示す新しい変数を作成しようとしています (つまり、精度 = 1)。上記のサブジェクト 400 の場合、結果の変数は c(1,1,1,1,1) になり、すべての質問が正しいことを示します。上記のサブジェクト 401 の場合、結果のデータは c(0,0,0,0,0) になり、1 つ以上の質問が間違っていたことを示します。これを実現するために、Plyr とその亜種のかなり紛らわしいヘルプ ファイルと例を解読して、この解決策を思いつくように最善を尽くしました。

ロジック: 1) 被験者ごとに、各トライアルの質問を個別に検討します 2) 渡されたデータ フレームの精度列を調べます 2) 精度の合計がトライアルの質問の数になる場合は、すべて 1 のベクトルを返し、それ以外の場合はすべて 0 のベクトルを返します

これは仕事を成し遂げるようです:

allOK<-function(x) {
  c<-length(x[,1]) #get number of questions for this trial
  s<-sum(x$accuracy) #get sum of accuracies
  return ( data.frame(rep(as.integer(s==c))) ) #return allOK vector
}

これは私のデータに適用する私の試みです:

alloktest<-ddply(.data=data,c("Subject","trial"), .fun=allOK, .progress = "text")

alloktest が Subject、trial、および結果を含む新しい変数のみを含むことを除いて、それは機能します。結果は正しいですが、新しい変数 (おそらく aok という名前) で元のデータ フレームを返すことを望んでいました。

どうすればそれを達成できますか?明確にするために、私はこれを探しています:

      ID    trial  question   RT   accuracy  aok
1     400   1      0          131  1          1
2     400   1      1          768  1          1
3     400   1      2          300  1          1
4     400   1      3          130  1          1
5     400   1      4          168  1          1
...
36    401   1      0          273  1          0
37    401   1      1          803  1          0
38    401   1      2          786  0          0
39    401   1      3          712  1          0
40    401   1      4          254  0          0

ありがとう!

4

1 に答える 1

4

私が考えることができる最も簡単なアプローチmutateは、のplyrバリエーションであるを使用することですtransform

 alloktest<-ddply(.data=data,c("Subject","trial"), mutate,  
     aok = sum(accuracy) == length(accuracy))

これは、すべての被験者と試験の組み合わせ内で、質問ごとに 1 行しかないことを前提としています。

于 2013-03-18T23:18:06.463 に答える