【问题标题】:calculating weighted sum of two columns with weights as two other columns计算权重为其他两列的两列的加权和
【发布时间】:2019-11-18 22:26:22
【问题描述】:

考虑以下数据集,包括 NAs

df <- data.frame(x1=c(3, 6, 9, NA),
                 w1=c(0.25, 1, 0.90, 0),
                 x2=c(2, NA, 4, 8),
                 w2=c(0.75, 0, 0.10, 1))

我想用dplyrmutateweighted.mean 计算一个新列为weighted_sum=x1.w1 + x2.w2,但我不知道如何设置变量和权重,我在其他下找不到确切的这个问题问题。结果应如下所示,不应将 NA 视为总和。

  x1   w1   x2   w2 weighted_sum
  3    0.25  2 0.75         2.25
  6    1.00 NA 0.00         6.00
  9    0.90  4 0.10         8.50
  NA   0.00  8 1.00         8.00

感谢您的帮助!

【问题讨论】:

  • 也可以df %&gt;% mutate(weighted_sum = rowSums(cbind(x1*w1, x2*w2), na.rm = TRUE))

标签: r dplyr


【解决方案1】:

怎么样

library(dplyr)

df %>%
  rowwise() %>%
  mutate(weighted_sum = sum((x1*w1), (x2*w2), na.rm = TRUE))
# -------------------------------------------------------------------------

#      x1    w1    x2    w2 weighted_sum
#     <dbl> <dbl> <dbl> <dbl>  <dbl>
# 1     3  0.25     2  0.75   2.25
# 2     6  1       NA  0      6   
# 3     9  0.9      4  0.1    8.5 
# 4    NA  0        8  1      8   

【讨论】:

    【解决方案2】:

    这是一个以 R 为基数的解决方案,用于抽象列数(x1、w1、x2、w2、x3、w3、x4、w4 等...)

    Reduce(`+`, sapply(split.default(replace(df, is.na(df), 0), gsub('\\D+', '', names(df))), function(i) i[1] * i[2]))
    #[1] 2.25 6.00 8.50 8.00
    

    【讨论】:

      【解决方案3】:

      基础 R 中适用于任意数量的列和权重的简单解决方案:

      df$weighted_sum <- mapply(function(x,y,z) sum(y[x,]*z[x,], na.rm = TRUE),
                               x = 1:nrow(df),
                               MoreArgs = list(
                               y = df[, grepl("^w", names(df))],
                              z = df[, grepl("^x", names(df))]))
      

      输出

      #  x1   w1 x2   w2 weighted_sum
      #  3 0.25  2 0.75         2.25
      #  6 1.00 NA 0.00         6.00
      #  9 0.90  4 0.10         8.50
      # NA 0.00  8 1.00         8.00
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-03
        • 2017-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        相关资源
        最近更新 更多