R中缺少值的加权平均值计算
Weighted mean calculation in R with missing values
有谁知道当值缺失时是否可以在 R 中计算加权平均值,并且当值缺失时,现有值的权重按比例向上扩展?
为了清楚地表达这一点,我创建了一个假设场景。这描述了问题的根源,其中标量需要针对每一行进行调整,具体取决于缺少哪些值。
Image: Weighted Mean Calculation
post 示例数据集的最佳方法是使用 dput(head(dat, 20))
,其中 dat
是数据集的名称。图形图像是一个非常糟糕的选择。
数据。
dat <-
structure(list(Test1 = c(90, NA, 81), Test2 = c(91, 79, NA),
Test3 = c(92, 98, 83)), .Names = c("Test1", "Test2", "Test3"
), row.names = c("Mark", "Mike", "Nick"), class = "data.frame")
w <-
structure(list(Test1 = c(18, NA, 27), Test2 = c(36.4, 39.5, NA
), Test3 = c(36.8, 49, 55.3)), .Names = c("Test1", "Test2", "Test3"
), row.names = c("Mark", "Mike", "Nick"), class = "data.frame")
代码。
为此,您可以使用基础包 stats
和 sapply
中的函数 weighted.mean
。请注意,如果您的音符和重量数据集是 class matrix
的 R 对象,则您将不需要 unlist
.
sapply(seq_len(nrow(dat)), function(i){
weighted.mean(unlist(dat[i,]), unlist(w[i, ]), na.rm = TRUE)
})
使用带有参数 na.rm = TRUE
的基础 stats
包中的 weighted.mean
应该可以得到您需要的结果。这是可以完成此操作的 tidyverse
方法:
library(tidyverse)
scores <- tribble(
~student, ~test1, ~test2, ~test3,
"Mark", 90, 91, 92,
"Mike", NA, 79, 98,
"Nick", 81, NA, 83)
weights <- tribble(
~test, ~weight,
"test1", 0.2,
"test2", 0.4,
"test3", 0.4)
scores %>%
gather(test, score, -student) %>%
left_join(weights, by = "test") %>%
group_by(student) %>%
summarise(result = weighted.mean(score, weight, na.rm = TRUE))
#> # A tibble: 3 x 2
#> student result
#> <chr> <dbl>
#> 1 Mark 91.20000
#> 2 Mike 88.50000
#> 3 Nick 82.33333
有谁知道当值缺失时是否可以在 R 中计算加权平均值,并且当值缺失时,现有值的权重按比例向上扩展?
为了清楚地表达这一点,我创建了一个假设场景。这描述了问题的根源,其中标量需要针对每一行进行调整,具体取决于缺少哪些值。
Image: Weighted Mean Calculation
post 示例数据集的最佳方法是使用 dput(head(dat, 20))
,其中 dat
是数据集的名称。图形图像是一个非常糟糕的选择。
数据。
dat <-
structure(list(Test1 = c(90, NA, 81), Test2 = c(91, 79, NA),
Test3 = c(92, 98, 83)), .Names = c("Test1", "Test2", "Test3"
), row.names = c("Mark", "Mike", "Nick"), class = "data.frame")
w <-
structure(list(Test1 = c(18, NA, 27), Test2 = c(36.4, 39.5, NA
), Test3 = c(36.8, 49, 55.3)), .Names = c("Test1", "Test2", "Test3"
), row.names = c("Mark", "Mike", "Nick"), class = "data.frame")
代码。
为此,您可以使用基础包 stats
和 sapply
中的函数 weighted.mean
。请注意,如果您的音符和重量数据集是 class matrix
的 R 对象,则您将不需要 unlist
.
sapply(seq_len(nrow(dat)), function(i){
weighted.mean(unlist(dat[i,]), unlist(w[i, ]), na.rm = TRUE)
})
使用带有参数 na.rm = TRUE
的基础 stats
包中的 weighted.mean
应该可以得到您需要的结果。这是可以完成此操作的 tidyverse
方法:
library(tidyverse)
scores <- tribble(
~student, ~test1, ~test2, ~test3,
"Mark", 90, 91, 92,
"Mike", NA, 79, 98,
"Nick", 81, NA, 83)
weights <- tribble(
~test, ~weight,
"test1", 0.2,
"test2", 0.4,
"test3", 0.4)
scores %>%
gather(test, score, -student) %>%
left_join(weights, by = "test") %>%
group_by(student) %>%
summarise(result = weighted.mean(score, weight, na.rm = TRUE))
#> # A tibble: 3 x 2
#> student result
#> <chr> <dbl>
#> 1 Mark 91.20000
#> 2 Mike 88.50000
#> 3 Nick 82.33333