R 找到多列的加权平均数?

R 找到多列的加权平均数?,r,statistics,R,Statistics,这是公式: 以下是使用dplyr中的rowwise和do的解决方案: 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")

这是公式:


以下是使用
dplyr
中的
rowwise
do
的解决方案:

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
库(dplyr)
图书馆(magrittr)
种子集(200)
#制作一些数据
vvv%as.data.frame()
名称(vvv)%#为每行计算
do(data.frame)(
rfm_得分=加权平均值(
x=c(.$rank\u recenty、.$rank\u freq、.$rank\u monetary\u v),
w=c(.2、.3、.5)
)
)
) %>% 
解组()%>%#撤消行组
使用_系列(“rfm_分数”)#提取加权平均值
头部(vvv)
#排名最近排名频率排名货币和rfm评分
#            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

使用
rowwise
do
,可以将
加权平均值作为每行的三元素向量传递

权重参数是
w
,而不是
y
。可能
适用(vvv,1,weighted.mean,w=c(0.2,0.3,0.5))
@ekstroem;假设没有missing@ekstroem可能矩阵版本是正确的,但是您能让
apply
版本在示例上工作吗,因为它返回:
'x'和'w'必须具有相同的长度
那么
apply(vvv[c(“rank\u-recenty”,“rank\u-freq”,“rank\u-monetary\u-v”)],1,加权平均值,w=c(0.2,0.3,0.5))