无法填充我的R for循环

时间:2017-11-24 19:07:12

标签: r for-loop matrix apply

所以我正在研究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]) }之类的东西也有效,所以我不明白发生了什么。

这是一个微不足道的问题,但我在互联网上找不到答案!虽然我知道我可能错过了明显的: - )......

非常感谢, 干杯!

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

中做的
相关问题