r - aggregate - 在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

有消息谢谢!

时间:

如果mean在不同的'身份证件'中存在重复列,请使用match获取第一个的位置,并获取


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行。在'身份证件',''中,获取mean,并将列与原始数据集绑定


library(tidyr)


data %>% 


 distinct(id, mean) %>%


 summarise(grand.mean = mean(mean)) %>% 


 uncount(nrow(data)) %>%


 bind_cols(data, .)



base R一行程序可以是:


mean(tapply(data$mean, data$id, '[', 1))


#[1] 6.5



将结果放入原始数据集do


data$grand.mean <- mean(tapply(data$mean, data$id, '[', 1))



你可以使用unique和caluculate mean来获得一个大的含义。


mean(unique(data)[,"mean"])


#[1] 6.5



或者你可以用id和caluculate mean来聚合,从而得到一个大的含义。


mean(aggregate(mean~id, data, base::mean)[,"mean"])


#[1] 6.5



或者使用ave来获取每个id的重复值,并将它用作weighted.mean中的权重。


weighted.mean(mean, 1/ave(id, id, FUN=length))


#[1] 6.5



如果你只需要一个单一的答案为大意思,只需使用两个''步骤与'dplyr ':


library(dplyr)



data %>% 


 group_by(id) %>% 


 summarise(mean = mean(mean)) %>% 


 summarise(grand.mean = mean(mean))



结果:


 grand.mean


 <dbl>


1 6.5



使用dplyr =�m쌧,我们可以将��x����|ܛ���Q�{{O�,�S��{#)�Sd =�coda��2���q�e8�q��)�S��N'�m쌧�M��-�G��m쌧每个yf_str的值,然后得到对整个数据集执行grand_mean =�m쌧,并对原始数据做一个},���M�-�G�����,将grand_mean =�m쌧添加为新列,


library(dplyr)



data %>%


 group_by(id) %>%


 summarise(grand_mean = mean(unique(mean))) %>%


 mutate(grand_mean = mean(grand_mean)) %>%


 right_join(data, by = 'id')



# A tibble: 11 x 3


# id grand_mean mean


# <dbl> <dbl> <dbl>


# 1 1 6.5 5


# 2 1 6.5 5


# 3 1 6.5 5


# 4 2 6.5 6


# 5 2 6.5 6


# 6 2 6.5 6


# 7 3 6.5 7


# 8 3 6.5 7


# 9 4 6.5 8


#10 4 6.5 8


#11 4 6.5 8



...