R:使用带权重的重塑2::acast进行聚合

R:使用带权重的重塑2::acast进行聚合,r,reshape2,R,Reshape2,我的目标是使用重塑2::acast()创建一个二维数组,其中聚合函数是加权平均值。这是一个廉价的加权平均函数: wmean <- function(x,w=rep(1,length(x))){ if (length(x)==0){ return(NA) } sum(x * w, na.rm = TRUE) / sum(w, na.rm = TRUE) } 但我想说的是: acast(Dat,cafloor2~tafloor2, value.var

我的目标是使用
重塑2::acast()
创建一个二维数组,其中聚合函数是加权平均值。这是一个廉价的加权平均函数:

wmean <- function(x,w=rep(1,length(x))){
    if (length(x)==0){
        return(NA)
    }
    sum(x * w, na.rm = TRUE) / sum(w, na.rm = TRUE)
}
但我想说的是:

acast(Dat,cafloor2~tafloor2, value.var = "srh", 
            fun.aggregate = wmean, w = "p_wt2")
其中,根据需要从
Dat
中获取权重。这会产生以下错误:

Error in x * w : non-numeric argument to binary operator

也许我今天头脑迟钝,但我一直在思考如何继续。当然欢迎非
acast()
解决方案。谢谢

我似乎不太明白如何通过使用
acast
获得正确的权重向量。有鉴于此,我将通过简单地先按组计算汇总统计数据,然后再计算结果来解决这个问题。下面是一个使用dplyr计算加权平均值的示例

require(dplyr)
Dat %>% group_by(cafloor2, tafloor2) %>% 
    summarise(wsrh = wmean(srh, p_wt2)) %>%
    acast(cafloor2 ~ tafloor2, value.var = "wsrh")
您可以使用tidyr的
spread
而不是
acast
,尽管输出格式略有不同,您可能更喜欢
acast
输出

require(tidyr)
Dat %>% group_by(cafloor2, tafloor2) %>% 
    summarise(wsrh = wmean(srh, p_wt2)) %>% 
    spread(tafloor2, wsrh)

最后我做了类似的事情,在
数据表中预先加权,然后进行铸造。也感谢您的解决方案!
require(dplyr)
Dat %>% group_by(cafloor2, tafloor2) %>% 
    summarise(wsrh = wmean(srh, p_wt2)) %>%
    acast(cafloor2 ~ tafloor2, value.var = "wsrh")
require(tidyr)
Dat %>% group_by(cafloor2, tafloor2) %>% 
    summarise(wsrh = wmean(srh, p_wt2)) %>% 
    spread(tafloor2, wsrh)