如何根据特定变量的第二个数据集创建加权总分

How to create a Weighted Sum Score based on a second dataset for specific variables

我必须根据几个变量创建加权总分 (WSum)。例如,mydata 具有三个变量(A、B 和 C)。我必须创建一个 'WSum' 分数,其中我将这些变量中的每一个乘以 weights 数据集中存在的权重,然后将它们相加 (A*0.5 + B*1.2 + C*2)。我必须在不更改数据集中的其他变量的情况下完成所有这些操作,例如,在本例中为变量 ID。

PS:我手动肯定能做到mutate(Wsum = (A*0.5 + B*1.2 + C*2))。但我想使这个过程自动化,因为正如您可能猜到的那样,我不会只有 3 个变量,这不是一次性的工作。提前致谢。

示例数据

需要包裹

library(dplyr)

示例数据

mydata <- tibble(ID = (01, 02
                 A = c(1, 2, 3),
                 B = c(2, 5, 4),
                 C = c(3, 6, 1))

>    # A tibble: 3 x 4
>     ID     A     B     C
>  <dbl> <dbl> <dbl> <dbl>
>1     1     1     2     3
>2     2     2     5     6
>3     3     3     4     1

数据权重字典

weights <- tibble( variables = c("A", "B", "C"),
                   w = c(0.5, 1.2, 2))

># A tibble: 3 x 2
>  variables     w
>  <chr>     <dbl>
>1 A           0.5
>2 B           1.2
>3 C           2 

预期结果

># A tibble: 3 x 5
>     ID     A     B     C  Wsum
>  <dbl> <dbl> <dbl> <dbl> <dbl>
>1     1     1     2     3   8.9
>2     2     2     5     6  19  
>3     3     3     4     1   8.3

base R中,转换为matrix

后使用%*%crossprod
mydata$Wsum <- as.vector(as.matrix(mydata[weights$variables]) %*% 
       with(weights, setNames(w, variables)))

-输出

mydata$Wsum
[1]  8.9 19.0  8.3

或使用tidyverse,循环across 'mydata'中的列,从deframed中获取相应的值(转换为命名向量)'weights', 相乘并得到 rowSums 以创建 'Wsum' 列

library(dplyr)
library(tibble)
mydata <- mydata %>%
  mutate(Wsum = rowSums(across(all_of(weights$variables),
    ~ .x * deframe(weights)[[cur_column()]])))
mydata
# A tibble: 3 × 4
      A     B     C  Wsum
  <dbl> <dbl> <dbl> <dbl>
1     1     2     3   8.9
2     2     5     6  19  
3     3     4     1   8.3