【问题标题】:Calculate Weighted Scores Across Rows计算跨行的加权分数
【发布时间】:2019-03-26 13:51:50
【问题描述】:

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

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

【问题讨论】:

    标签: r


    【解决方案1】:

    一种简单的方法是将其视为矩阵乘以向量。

    M = as.matrix(df)
    M %*% 1:ncol(M)
    

    【讨论】:

      【解决方案2】:

      如果您想为快速任务构建函数,您可以使用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 年 3 月 26 日创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 2017-06-17
        • 1970-01-01
        • 2016-01-24
        • 1970-01-01
        相关资源
        最近更新 更多