如何根据特定变量的第二个数据集创建加权总分
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'中的列,从deframe
d中获取相应的值(转换为命名向量)'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
我必须根据几个变量创建加权总分 (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'中的列,从deframe
d中获取相应的值(转换为命名向量)'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