【问题标题】:Double For Loop and calculate averages in RDouble For循环并计算R中的平均值
【发布时间】:2015-02-21 19:42:32
【问题描述】:

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

基本上,我有两列,我想使用 Double For 循环来计算两列中每个数字之间的平均值,以便生成平均值向量。澄清一下,apply 和 mean 函数不是最好的函数,因为我只需要一半的可能组合来获得平均值。例如:

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 平均。我想使用双循环的原因是为了消除重复。这是提供可视化的矩阵版本:

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 中的一个数字。但是,请注意矩阵对角线的两侧都有冗余。因此,使用双 For 循环,我消除了冗余以获得唯一案例组合的平均值。使用上面的矩阵,它应该是这样的:

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

【问题讨论】:

  • 您的示例不可重现,因为您在Q1 中没有两列,或者您可以在矩阵上执行Q1$Col1 之类的操作。这里期望的输出是什么?
  • 我对这个算法的预期结果感到困惑,但它可能有一个错误:i+1:length(Q1$Col2) 首先生成一个从 1 到 length(Q1$Col2) 的序列,然后将 1 加到向量。或许,OP的意思是从i+1length(Q1$Col2)的序列,例如可以通过(i+1):length(Q1$Col2)得到。
  • 说实话,不是很多。您能否为您的数据集显示手动计算的预期输出?
  • 在你的第二个循环中,尝试将i + 1 放在括号内,如(i+1)
  • @DavidArenburg 您先生是救世主!你想要我做什么?哈哈

标签: r for-loop mean


【解决方案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)

【讨论】:

    【解决方案2】:

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

    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 用于列。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-02-02
        • 2016-12-22
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 2019-11-30
        • 2021-06-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多