0

ACC と呼ばれるベクトルの長さで S の値を delta1 と delta2 で更新するばかげた関数があります。

Sstart=0           #a starting value for S
ACC=c(1,1,0,1,1)   #accuracy: 0 or 1
f=c(1,1,1,1,0)     #feedback: 0 or 1
ID=rep(1,5)        #ID of the participant
delta1=seq(1,5,1)
delta2=seq(1,5,1)
m<-as.matrix(expand.grid(delta1=delta1, delta2=delta2)) #all the possible combination of       delta1 and delta2

機能は以下です。フィードバック (f) が 1 の場合は S を delta1 で更新し、ffedback が 0 の場合は delta2 で更新します。Delta1 と delta2 の範囲は 1 から 5 で、個別にインクリメントします。

silly_function<-function(delta1, delta2,ACC,f,Sstart){
  S = Sstart
  for (i in 1:length(ACC)){
    if (ACC[i]==1 & f[i]==1){
      S[i+1]=S[i]+delta1
    }
    else if (ACC[i]==1 & f[i]==0){
      S[i+1]=S[i]+delta2
    }
    else if (ACC[i]==0){                        
      S[i+1]=S[i]
    }
  }
  return(S)
}

関数を呼び出します

N=length(delta1)*length(delta2) 
SMat<-matrix(data=NA, nrow=N, ncol=(length(ACC)+1)) #matrix for the data

for (i in 1:N){
  SMat[i,] <- silly_function(m[i,1],m[i,2],ACC,f,Sstart)}

私の問題: 関数は 1 つの被験者に対して完全に機能しますが、すべての被験者に個別に適用するための巧妙な方法を見つけることができません (参加者からのすべてのデータが 1 つのデータ フレームにあるデータ フレームがあります)。 1 つの行列またはデータ フレーム。plyr パッケージの ddply を使用したかったのですが、私のような例を見つけて変更し、この場合の実装方法を理解することができませんでした。コメント/ヒントを事前にありがとうございます!

2人の参加者への私の意見

ID    Feedback    ACC
1       1          1
1       1          1
1       1          0
1       1          1
1       0          1
2       1          1
2       1          1
2       0          1
2       1          0
2       1          1

実際の出力

V1 V2 V3 V4 V5 V6 
0  1  2  2  3  4 #row1
0  2  4  4  6  7
.
.
0  5  10  10  15 20 #row25

サブジェクト 1 の出力は次のとおりです。25 * 6 (行 * 列) 行列: 25 行 delta1 と delta2 のすべての可能な組み合わせで S を更新するためです。Sstart が 0 であるため、最初の列は常に 0 です。

望ましい出力 基本的に被験者 1 と同じですが、すべての被験者データを使用します。

件名 1 の 1 ~ 25 行

件名 2 の 26 ~ 50 行...

4

0 に答える 0