Double For Loop并计算R中的平均值

时间:2015-02-21 19:42:33

标签: r for-loop mean

我有一个小问题,我不确定如何解决错误。

基本上,我有两列,我想使用Double For Loop来计算两列中每个数字之间的平均值,这样就得到了平均值的向量。澄清,应用和表示函数不是最好的函数,因为我只需要总可能组合的一半来获得平均值。例如:

Col1<-c(1,2,3,4,5)
Col2<-c(1,2,3,4,5)
Q1<-data.frame(cbind(Col1, Col2))

Q1$mean<-0
for (i in 1:length(Q1$Col1)) {
  for (j in i+1:length(Q1$Col2)) {
    Q1$mean[i]<-(Q1$Col1[i]+Q1$Col2[j])/2
  }
}

基本上,对于Q1 $ Col1中的每个数字,我希望它与Q1 $ Col2平均。我想使用double for循环的原因是为了消除重复。这是提供可视化的矩阵版本:

1.0 1.5 2.0 2.5 3.0
1.5 2.0 2.5 3.0 3.5
2.0 2.5 3.0 3.5 4.0
2.5 3.0 3.5 4.0 4.5
3.0 3.5 4.0 4.5 5.0

此处,每行代表Q1 $ Col1中的数字,每列代表Q1 $ Col2中的数字。但是,请注意矩阵对角线两侧都有冗余。因此,使用Double For Loop,我消除了冗余以获得独特案例组合的平均值。使用上面的矩阵,它应该如下所示:

1.0 1.5 2.0 2.5 3.0
    2.0 2.5 3.0 3.5
        3.0 3.5 4.0
            4.0 4.5
                5.0

3 个答案:

答案 0 :(得分:1)

我认为你要问的是:给定两个数字向量,我如何找到每个向量中第一个项目的平均值,每个向量中第二个项目的平均值,等等。如果是这样,那么这是一种方法。

首先,您希望使用cbind()而不是rbind()才能获得列而不是行。

Col1<-c(1,2,3,4,5)
Col2<-c(2,3,4,5,6)
Q1<-cbind(Col1, Col2)

然后你可以使用函数[rowMeans()][1]找出(你猜对了)每行的方法。 (另请参阅rowSums()colMeans()以及colSums()。)

rowMeans(Q1)
#> [1] 1.5 2.5 3.5 4.5 5.5

更常见的方法是apply()函数,它允许我们将函数应用于每个列或行。在这里,我们使用参数1将其应用于行(因为第一行采用Col1Col2等的第一项。)。

apply(Q1, 1, mean)

结果如下:

#> [1] 1.5 2.5 3.5 4.5 5.5

如果你真的想要它们在你现有的矩阵中,你可以这样做:

means <- rowMeans(Q1)
cbind(Q1, means)

答案 1 :(得分:1)

你不需要循环来获得平均值,你可以使用矢量化操作:

Col1 <- c(1,2,3,4,5)
Col2 <- c(2,3,4,5,6)
Mean <- (Col1+Col2)/2
Q1 <- rbind(Col1, Col2, Mean)

但是rbind将你的向量视为行,你可以使用cbind作为列。

答案 2 :(得分:1)

您可以使用outer函数首先计算平均值,然后使用lower.triNA值填充矩阵对角线下方的区域。

matrix<-outer(Q1$Col1, Q1$Col2, "+")/2
matrix[lower.tri(matrix)] = NA