我正在研究一个需要我从列中减去信息的数据集。这是一个重复测量数据集,其中一个人最多被测试六次,最少两次。数据为长格式
这是一个示例数据集:
ID=c('X1', 'X1', 'X1', 'X1', 'X2', 'X2', 'X2', 'X3', 'X3', 'X3', 'X3')
Time=c(1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4)
Score=c(10, 9, 8, 6, 10, 8, 4, 9, 8, 6, 4)
dat=data.frame(ID, Time, Score)
在最简单的形式中,我的数据包含以下变量:
Participant ID
- 唯一的字母数字代码Time
- 从 1 到 6 不等Score
- 测试 1 的分数从 1 到 10 不等。重复测试后分数可能保持不变或下降。
我想计算测试会话中连续分数之间的差异,将它们相加,然后除以每个参与者的分数。以更简单的形式,我希望它如下所示:
Sum of [(time1-time2 score) + (time2-time3 score) + (time3-time4 score)]/N (Scores for participant)
分母必须考虑每个参与者的不同重复测量次数。
早些时候,我的代码是这样的:
S = length(unique(dat$ID))
dat$ppt = as.numeric(factor(dat$ID, labels = 1:S))
mat = matrix(nrow = S, ncol = 2) # empty matrix
for (s in 1:S) { # for each subject
scores = dat[dat$ID == s, 'Score'] # get scores for participant s
scores = na.omit(scores)
avCumDiff = sum(diff(scores))/length(scores) # average cumulative difference
mat[s,] = c(s, avCumDiff) # add to matrix
}
colnames(mat) <- c('ppt', 'AvDiff')
这段代码的问题在于它会累积地相互减去分数。我希望它添加分数 1&2、2&3、3&4 等之间的差异。
我怎样才能做到最好?