计算各行的加权分数

时间:2019-03-26 13:51:51

标签: r

我正在寻找一种更优雅的方法来计算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)

是否有更好的方法通过引用列名(分数)和循环函数来计算加权分数?数据集包含更多列,我真的不想修复索引编号,以防添加其他变量时索引编号发生更改。

2 个答案:

答案 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创建