【问题标题】:Find weighted mean with multiple columns?找到多列的加权平均值?
【发布时间】:2018-07-28 08:30:20
【问题描述】:

这是公式:

????。 ??? × ???? + ????。 ??? × ???? + ????。 ??? × ????

我想从代表 RFM

的 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
  • 可能是apply(vvv, 1, weighted.mean, w = c(0.2, 0.3, 0.5))
  • @ekstroem ;假设没有遗漏
  • @ekstroem 矩阵版本可能是正确的,但您能否让apply 版本在示例上工作,因为它返回:'x' and 'w' must have the same length
  • apply(vvv[c("rank_recency", "rank_freq", "rank_monetary_v")], 1, weighted.mean, w = c(0.2, 0.3, 0.5)) 怎么样?

标签: r statistics


【解决方案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 的值作为每行的三元素向量传递。

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2019-01-28
    • 2021-09-21
    • 2022-10-04
    • 1970-01-01
    • 2020-11-12
    相关资源
    最近更新 更多