首页 > 解决方案 > 从 r 中的均值计算总均值

问题描述

我正在尝试从学生的平均分数中汇总一个总平均值。这是我的数据集的样子:

id <-    c(1,1,1, 2,2,2, 3,3, 4,4,4)
mean <- c(5,5,5, 6,6,6, 7,7, 8,8,8)

data <- data.frame(id,mean)

> data
   id mean
1   1     5
2   1     5
3   1     5
4   2     6
5   2     6
6   2     6
7   3     7
8   3     7
9   4     8
10  4     8
11  4     8

我正在使用dplyr包进行此计算。我用这个,

data %>%
  mutate(grand.mean = mean(mean))

   id mean grand.mean
1   1    5   6.454545
2   1    5   6.454545
3   1    5   6.454545
4   2    6   6.454545
5   2    6   6.454545
6   2    6   6.454545
7   3    7   6.454545
8   3    7   6.454545
9   4    8   6.454545
10  4    8   6.454545
11  4    8   6.454545

但是,这并没有考虑每个 id 的重复均值。计算应该从每个 id 中获取唯一的方法并将它们平均。所以它(5+6+7+8)/4 = 6.5不是6.45.

有任何想法吗?谢谢!

标签: raggregate

解决方案


mean如果在不同的 'id' 中有重复项,则用于match获取第一个 'id' 的位置并获取mean'mean' 列的位置

library(dplyr)
data %>%
     mutate(grand.mean = mean(mean[match(unique(id), id)]))
#   id mean grand.mean
#1   1    5        6.5
#2   1    5        6.5
#3   1    5        6.5
#4   2    6        6.5
#5   2    6        6.5
#6   2    6        6.5
#7   3    7        6.5
#8   3    7        6.5
#9   4    8        6.5
#10  4    8        6.5
#11  4    8        6.5

或者另一种选择是duplicated

data %>%
       mutate(grand.mean = mean(mean[!duplicated(id)]))

或采取distinct行。'id', 'mean', 获取mean, 并将列与原始数据集绑定

library(tidyr)
data %>% 
   distinct(id, mean) %>%
   summarise(grand.mean = mean(mean)) %>% 
   uncount(nrow(data)) %>%
   bind_cols(data, .)

推荐阅读