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 行...