R:ddply用于更新功能

时间:2013-09-10 12:38:04

标签: r

我有一个愚蠢的函数,它通过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时,当ffedback为0时,它以delta1更新S,然后使用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行...

0 个答案:

没有答案