0

我有一个愚蠢的函数,它通过 delta1 和 delta2 更新称为 ACC 的向量长度中 S 的值。

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 时,它通过 delta1 更新 S,当反馈为 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 个主题非常有效,但我找不到一种聪明的方法将它分别应用于我的所有主题(我有一个数据框,其中我的参与者的所有数据都在一个数据框中)并将结果合并到一个矩阵或数据框。我想使用 plyr 包中的 ddply ,但我找不到类似于我的示例来修改它并了解如何在这种情况下实现它。非常感谢您提前提出意见/提示!

我对两位参与者的意见

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。第一列始终为 0,因为 Sstart 为 0。

所需的输出 与主题 1 基本相同,但包含所有主题数据

主题 1 为 1-25 行

主题 2 为 26-50 行...

4

0 回答 0