我正在努力从r中的表中获得平衡均值。在下表中,我想返回每个位置的平均值,但如果每个位置的“名称”总数超过一个,我想取平均值而不是平均值。
Name Loc Total
Jeff IA 17
Jill IA 67
Jeff IL 12
Jeff IL 13
Jill IL 45
Jeff MN 32
Jill MN 65
Jeff WI 23
Jill WI 67
name <- c("Jeff", "Jeff", "Jeff", "Jeff", "Jeff", "Jill", "Jill", "Jill", "Jill")
loc <- c("IL", "IL","MN","WI","IA", "IL", "MN","WI","IA")
total <- c(12, 13, 32, 23, 17, 45, 65, 67, 67)
table <- data.frame(name, loc, total) %>% arrange(location)
如果我为此返回平均值
t3 <- aggregate(total ~ location, table , mean)
IA 42.00000
IL 23.33333
MN 48.50000
WI 45.00000
但是IL有3个值,Jeff在他的名字下有2个,所以IL的平均值应该是((12 + 13)/ 2 + 45)/ 2 = 28.75
这可以在R中完成吗。我很难过
答案 0 :(得分:2)
好像你已经在使用dplyr
,所以解决方案就是
table %>% group_by(loc, name) %>%
summarize(total=mean(total)) %>%
summarize(total=mean(total))
# loc total
# <fctr> <dbl>
# 1 IA 42.00
# 2 IL 28.75
# 3 MN 48.50
# 4 WI 45.00
首先我们按照loc和name进行分组。在第一次总结之后,我们崩溃了名称,以便不再分组。第二个总结使用了每个名称的方式。
答案 1 :(得分:1)
以下是使用R
的基础aggregate
替代方案:
aggregate(total ~ loc, data = aggregate(total ~ loc + name, data = table, FUN = mean), FUN = mean)
loc total
1 IA 42.00
2 IL 28.75
3 MN 48.50
4 WI 45.00