所以我正在研究R,其矩阵如下:
diff_0
SubPop0-1, SubPop1-1, SubPop2-1, SubPop3-1, SubPop4-1,
SubPop0-1, NA NA NA NA NA
SubPop1-1, 0.003403100 NA NA NA NA
SubPop2-1, 0.005481177 -0.002070277 NA NA NA
SubPop3-1, 0.002216444 0.005946314 0.001770977 NA NA
SubPop4-1, 0.010344845 0.007151529 0.004237316 -0.0021275130 NA
......但更大; - )。
这是每个SubPop从0到4之间成对遗传差异的矩阵。我想获得每个subPop的平均差异值。
例如,对于SubPop-0,平均值将仅对应于第1列中4个值的平均值。但对于SubPop-2,这将是第3行中2个值的平均值和第2个值中的2个值。第3列,因为这是一个半矩阵。
我想写一个for循环来计算每个SubPop的每个平均值,并考虑到这一点。我尝试了以下方法:
Mean <- for (r in 1:nrow(diff_0)) {
mean(apply(cbind(diff_0[r,], diff_0[,r]), 1, sum, na.rm=T))
}
首先,这将隔离索引[r]的每一行和每列,其值指向相同的SubPop r。 &#39;和&#39;能够收集这些价值并消除“NA”。最后,我获得了SubPop r的平均值。我希望我的for循环能给我每个索引r的值,这将是一个SubPop。
然而,尽管我的mean(apply(cbind(diff_0[r,], diff_0[,r]), 1, sum, na.rm=T))
,如果单独使用1到5之间的固定r值,确实给了我想要的东西;那么循环&#39; for循环&#39;本身只返回一个空向量。
for (r in 1:nrow(diff_0)) { print(diff_0[r,1]) }
之类的东西也有效,所以我不明白发生了什么。
这是一个微不足道的问题,但我在互联网上找不到答案!虽然我知道我可能错过了明显的: - )......
非常感谢, 干杯!
答案 0 :(得分:0)
好的,根据你想做的事情(如果我理解正确的话),有几种方法可以做到这一点。 现在我想到的只是将你的下三角矩阵变成一个整个矩阵&#34; (即用下三角形的转置填充上三角形)然后做行或列方式 我的R现在正在运行其他东西,所以我无法检查我的代码,但这应该可行
diff = diff_0
diff[upper.tri(diff)] = t(diff_0[lower.tri(diff)]) #This step might need some work
正如我所说,我的R现在正在运行,所以我无法检查最后一行的正确性 - 我可能会对那里的一些转置感到困惑,所以我很感激任何关于它是否实际的反馈是否工作。
然后,您可以将对角线值设置为0,或者将na.rm = TRUE添加到均值语句
mean_diffs = apply(diff,2,FUN = function(x)mean(x, na.rm = TRUE))
应该有效
另外:是的,您的代码不起作用,因为赋值不在for循环中。这应该有效:
means = rep(NA, nrow(diff_0)
for (r in 1:length(means)){
means[r] = mean(apply(cbind(diff_0[r,], diff_0[,r]), 1, sum, na.rm=T))
但一般来说,循环不是你想要在R
中做的