我正在寻找一种更优雅的方法来计算7列的加权得分,如下所示。
每列代表一个条件得分(从1到7),观察值代表在该得分处观察到的百分比(每行必须总计为1)。
加权分数就是每个行变量的总和乘以条件分数。
创建数据集:
rand.sum <- function(n) {
x <- sort(runif(n-1))
c(x,1) - c(0,x)
}
df <- t(replicate(10,rand.sum(7)))
colnames(df)<-c(1:7) # Change the column names to reflect condition value
df <- as.data.frame(df)
创建加权分数列(用我的方式...):
df$weightedCondScore <- ((df[,1]) * 1) + ((df[,2]) * 2) +
((df[,3]) * 3) + ((df[,4]) * 4) +
((df[,5]) * 5) + ((df[,6]) * 6) +
((df[,7]) * 7)
是否有更好的方法通过引用列名(分数)和循环函数来计算加权分数?数据集包含更多列,我真的不想修复索引编号,以防添加其他变量时索引编号发生更改。
答案 0 :(得分:4)
一种简单的方法是将其视为矩阵乘以向量。
M = as.matrix(df)
M %*% 1:ncol(M)
答案 1 :(得分:1)
如果您想为快速任务构建函数,则可以使用apply
系列函数来对权重值的列进行运算,然后使用rowSums
将分数分配给您的数据框。
weighted <- sapply(1:ncol(df), function(i) df[,i] * i)
df$weightedCondScore <- rowSums(weighted)
如果您是像我这样在tidyverse
管道中进行思考的人之一,那么较为冗长但仍然灵活的一种方法是分配行号,将数据处理为长形,然后计算权重按组评分,然后重新调整为宽幅格式。
library(dplyr)
library(tidyr)
df %>%
mutate(id = row_number()) %>%
gather(key = weight, value = value, -id) %>%
mutate(weight = as.numeric(weight)) %>%
group_by(id) %>%
mutate(wtd_score = sum(value * weight)) %>%
spread(key = weight, value = value) %>%
head(3)
#> # A tibble: 3 x 9
#> # Groups: id [3]
#> id wtd_score `1` `2` `3` `4` `5` `6` `7`
#> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 3.58 0.264 0.198 0.0508 0.0155 0.171 0.249 0.0508
#> 2 2 4.15 0.0640 0.0960 0.334 0.111 0.144 0.0295 0.221
#> 3 3 5.24 0.116 0.0439 0.0548 0.102 0.148 0.0205 0.515
由reprex package(v0.2.1)于2019-03-26创建