如何使用多列计算加权平均值?

4
这是公式:

. × + . × + . ×

我想从代表R、F和M的3列中找到加权平均值。
我尝试了这个方法:
vvv$rfm_score=weighted.mean(x=c(vvv$rank_recency, vvv$rank_freq, vvv$rank_monetary_v)
              ,w=c(.2,.3,.5))

但它给出的列对于所有行都是相同的吗?

为了澄清,每一列都有一个从1到5的数字。然后,根据需要每次使用其中一列,按照公式计算加权平均值。

问题肯定出在我使用的weighted.mean函数上,但经过尝试不同的方法并查阅帮助页面,我找不到正确的方法。


权重参数是 w,不是 y - Rui Barradas
1
也许可以使用apply(vvv, 1, weighted.mean, w = c(0.2, 0.3, 0.5)) - Rui Barradas
1
@ekstroem;假设没有遗漏。 - user20650
@ekstroem 可能矩阵版本是正确的,但您能否使“apply”版本在示例上正常工作,因为它返回:“'x'和'w'必须具有相同的长度”。 - J_p
apply(vvv[c("rank_recency", "rank_freq", "rank_monetary_v")], 1, weighted.mean, w = c(0.2, 0.3, 0.5)) 这个怎么样? - ekstroem
sapply没有边距参数,你是指apply吧。不管怎样,用apply就可以了。谢谢。 - J_p
1个回答

1

以下是使用 dplyrrowwisedo 方法的解决方案:

library(dplyr)
library(magrittr)

set.seed(200)

# Make some data

vvv <-  matrix(sample(1:5,replace = TRUE,18),ncol = 3) %>% as.data.frame()

names(vvv) <- c("rank_recency","rank_freq","rank_monetary_v")  

head(vvv)
# rank_recency rank_freq rank_monetary_v
#            3         4               1
#            3         1               4
#            3         3               2
#            4         2               2
#            4         3               3
#            5         4               1

vvv$rfm_score <-   vvv %>% 
  rowwise() %>% # compute for each row
  do(data.frame(
            rfm_score=weighted.mean(
                          x=c(.$rank_recency,.$rank_freq,.$rank_monetary_v),
                          w=c(.2,.3,.5)
                      )
               )
     ) %>% 
  ungroup() %>% # undo row groups
  use_series("rfm_score") # extract the weighted means

head(vvv)
# rank_recency rank_freq rank_monetary_v rfm_score
#            3         4               1       2.3
#            3         1               4       2.9
#            3         3               2       2.5
#            4         2               2       2.4
#            4         3               3       3.2
#            5         4               1       2.7

使用rowwisedo,您可以将每行的值作为三个元素向量传递给weighted.mean

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