如何使用另一个矩阵的列(或行)计算每列(或行)的加权平均值?

3

我有两个大小完全相同的矩阵:mw,它们分别如下所示:

set.seed(5)
m <- matrix(rexp(90), nrow = 3 , ncol = 3)

set.seed(10)
w <- matrix(rexp(90), nrow = 3 , ncol = 3)

我想使用 w 作为权重来计算 m 的加权平均数。更准确地说,我想对 m 的每行(或每列)使用相同的 w 行(或列)作为权重进行计算。结果理想情况下将存储在向量中。例如:

w_mean_col <- c(weighted.mean(m[,1] , w[,1]) ,
            weighted.mean(m[,2] , w[,2]) ,
            weighted.mean(m[,3] , w[,3]) )

对于列:

w_mean_row <- c(weighted.mean(m[1,] , w[1,]) ,
                weighted.mean(m[2,] , w[2,]) ,
                weighted.mean(m[3,] , w[3,]) ) 

在使用非常大的矩阵时,这段代码非常不实用。是否有更好的代码可以自动完成此操作?

2个回答

2

您可以简单地执行以下操作:

colSums(m*w)/colSums(w)  ## columns
# [1] 0.2519816 0.4546775 0.7812545
rowSums(m*w)/rowSums(w)  ## rows
# [1] 0.2147437 0.5273465 1.0559481

应该是最快的。

或者,如果你坚持使用weighted.mean(),你可以使用mapply

mapply(weighted.mean, as.data.frame(m), as.data.frame(w), USE.NAMES=F)  ## columns
# [1] 0.2519816 0.4546775 0.7812545
mapply(weighted.mean, as.data.frame(t(m)), as.data.frame(t(w)), USE.NAMES=F)  ## rows
# [1] 0.2147437 0.5273465 1.0559481

1
谢谢,第一个答案非常简单而有效。 - Adrian

-1
我们可以使用 tidyverse
library(dplyr)
as.data.frame(m) %>%
   summarise(across(everything(), 
       ~ weighted.mean(., as.data.frame(w)[[cur_column()]])))

或者我们可以在按列拆分矩阵后使用Map,然后应用weighted.mean来获取相应的平均值。
unlist(Map(weighted.mean, asplit(m, 2), asplit(w, 2)))

如果是按行,则按行拆分

unlist(Map(weighted.mean, asplit(m, 1), asplit(w, 1)))

或者可以使用一个 for 循环

w_mean_col <- numeric(ncol(m))
for(i in seq_along(w_mean_col)) w_mean_col[i] <- weighted.mean(m[,i], w[,i])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接