在R中,如何跨for循环中的条件值进行计算?
testdataX包含几个列;对于每个主题,SubNo,TopicNo每个主题8个主题,因此每个主题有8行,Test2RT反应时间和Test2acc准确性。我的最终目标是获得每个受试者的反应时测量值,在各个主题之间取平均值,并且仅针对那些受试者答对了问题的主题,即Test2acc==1。我是R的新手,所以我试过:在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
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