在R中,如何跨for循环中的条件值进行计算?

在R中,如何跨for循环中的条件值进行计算?,r,loops,for-loop,R,Loops,For Loop,testdataX包含几个列;对于每个主题,SubNo,TopicNo每个主题8个主题,因此每个主题有8行,Test2RT反应时间和Test2acc准确性。我的最终目标是获得每个受试者的反应时测量值,在各个主题之间取平均值,并且仅针对那些受试者答对了问题的主题,即Test2acc==1。我是R的新手,所以我试过: for (i in subvecA) { TcorrtA[i] = mean(testdataX$Test2RT[testdataX$TopicNo==1

testdataX包含几个列;对于每个主题,SubNo,TopicNo每个主题8个主题,因此每个主题有8行,Test2RT反应时间和Test2acc准确性。我的最终目标是获得每个受试者的反应时测量值,在各个主题之间取平均值,并且仅针对那些受试者答对了问题的主题,即Test2acc==1。我是R的新手,所以我试过:

   for (i in subvecA) {
            TcorrtA[i] = mean(testdataX$Test2RT[testdataX$TopicNo==1 & testdataX$SubNo==i & 
    testdataX$Test2acc==1] + testdataX$Test2RT[testdataX$TopicNo==3 & testdataX$SubNo==i & 
    testdataX$Test2acc==1] + testdataX$Test2RT[testdataX$TopicNo==5 & testdataX$SubNo==i & 
    testdataX$Test2acc==1] + testdataX$Test2RT[testdataX$TopicNo==7 & testdataX$SubNo==i & 
testdataX$Test2acc==1])
        }
这看起来是对的;在我看来,这是在说:对于subvecA中的每个主题,只要答案正确,就得到该人每个主题的test2RT的平均值

我收到一条错误消息,内容如下:

TcorrtA[i]=testdataX$Test2RT[testdataX$TopicNo==1&testdataX$SubNo==1时出错: 替换长度为零

作为初始调试尝试,我插入了我的一个主题编号,并分别运行每一行,例如:

testdataX$Test2RT[testdataX$TopicNo==7 & testdataX$SubNo==9 & testdataX$Test2acc==1]
给我那个人在那个试验中的反应时间,这个试验对象是正确的。 但当我运行一个类似的行,其中被试得到的结果是错误的,输出结果是:numeric0。我想我预期的是NA或可能是FALSE,并且计算平均值时它会忽略NA/FALSE,但我的两个假设都不正确

我觉得它无法在一些输出提供数字0的试验中运行操作。我如何解决这个问题


感谢您提供的任何见解。

请为这些问题提供一个最简单的工作示例

set.seed(1618)
testdataX <- data.frame(SubNo = rep(1:10, each = 8), TopicNo = 1:8,
                        Test2ans = rbinom(80, 1, .5), Test2acc = rnorm(80))

# head(testdataX, 10)
#    SubNo TopicNo Test2ans   Test2acc
# 1      1       1        0  1.9079326
# 2      1       2        1  1.5649938
# 3      1       3        0 -1.5409056
# 4      1       4        0 -2.3135941
# 5      1       5        0 -1.0416061
# 6      1       6        1 -3.5043291
# 7      1       7        1 -0.7204609
# 8      1       8        0  0.3278730
# 9      2       1        0 -1.2320833
# 10     2       2        0 -1.3178366
by(df <- testdataX[testdataX$Test2ans == 1, ], df$SubNo, 
                  FUN = function(x) mean(x$Test2acc))
with(df, ave(Test2acc, SubNo, FUN = mean))
with(df, tapply(Test2acc, SubNo, mean))
aggregate(Test2acc ~ SubNo, data = df, FUN = mean)
## pre-allocate some memory (good practice to start)
TcorrtA <- numeric(length(unique(testdataX$SubNo)))
for (i in unique(testdataX$SubNo)) {
  ## take the mean of a subset of the data by subject number but only when 
  ## the test answer is 1, ie, correct answer
  ## and I only care about the Test2acc column
  ## then take the mean of that vector
  TcorrtA[i] = mean(testdataX[with(testdataX, SubNo == i & Test2ans == 1), 'Test2acc'])
}
TcorrtA
# [1] -0.88659871 -0.44081851 -0.04615321  0.03587924 -0.66483847  0.34371615
# [7] -0.26312176 -0.36862050  0.59667122  0.49787479