【问题标题】:Average by row and column按行和列平均
【发布时间】:2020-05-31 05:02:45
【问题描述】:

我有一个大矩阵,对于每个单元格,我想计算落在该特定单元格的列和行中的数字的平均值。

由于矩阵包含 NA 值,我对跳过它们不感兴趣

我怎样才能加快速度并做得更好?

谢谢

mtx <- matrix(seq(1:25), ncol = 5)
mtx[2,3] <- NA

mean.pos <- mtx
for(i in 1:dim(mtx)[1]){

  for(j in 1:dim(mtx)[2]){

    if(is.na(mtx[i,j])){

    } else {
      row.values <- mtx[i, !is.na(mtx[i,])]

      # -- Remove mtx[i,j] value itself to not count it twice
      row.values <- row.values[-which(row.values == mtx[i,j])[1]]

      col.values <- mtx[!is.na(mtx[,j]),j]
      mean.pos[i,j] <- mean(c(row.values, col.values), na.rm = T)
    }      
  }
}

【问题讨论】:

  • 您的代码说您想删除与您的特定单元格具有相同值的行上的值,但是(1)您没有解释,对吗? (2) 注意,浮点的相等性是相对的(并不总是你认为应该的),见stackoverflow.com/q/9508518/3358272。阅读后,请澄清您的问题。 (我怀疑rowMeans/colMeans 或对apply 的几个不那么琐碎的调用将满足您的需求。)
  • 是的,抱歉,我想取列行的平均值。方式对于我这样做的方式,我删除了行向量,否则当我计算平均值时,我将计算该单元格两次。

标签: r row calculator


【解决方案1】:

这样做无需显式循环遍历元素。

num <- outer(rowSums(mtx, na.rm = TRUE), colSums(mtx, na.rm = TRUE), "+") - mtx
not_na <- !is.na(mtx)
den <- outer(rowSums(not_na), colSums(not_na), "+") - 1
result <- num/den

# check
identical(result, mean.pos)
## [1] TRUE

如果没有 NA,则可以简化为:

(outer(rowSums(mtx), colSums(mtx), "+") - mtx) / (sum(dim(mtx)) - 1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 2012-12-18
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多