如何在 R 编程中找到数据框列的子组内的平均值?
How to find the average within the subgroups of columns of data frame in R programming?
trt<-c(1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3 ,3)
plant<-c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5 ,5, 5, 5)
change<-c(-9, -6, -4 , 7 , 4, 11, 18, 5, 29, 10, 29, 36, 10, 9, 4, -1 ,14 ,16 , 9 , 0, -2, 6,14, 18, -6, 13, 11, -1, 7, 15)
df<-data.frame(trt,plant,change)
我想要这样的结果——trt 中前 2 个条目相同的变化的平均值。
我的数据有 30 行,我想要 15 行结果,请帮助
我们可以通过总结来做一个小组
library(dplyr)
df %>%
group_by(trt, plant) %>%
summarise(avg_change = mean(change, na.rm = TRUE), .groups = 'drop') %>%
arrange(plant)
-输出
# A tibble: 15 x 3
# trt plant avg_change
# <dbl> <dbl> <dbl>
# 1 1 1 -7.5
# 2 2 1 1.5
# 3 3 1 7.5
# 4 1 2 11.5
# 5 2 2 19.5
# 6 3 2 32.5
# 7 1 3 9.5
# 8 2 3 1.5
# 9 3 3 15
#10 1 4 4.5
#11 2 4 2
#12 3 4 16
#13 1 5 3.5
#14 2 5 5
#15 3 5 11
或使用collapse
library(collapse)
df %>%
fgroup_by(trt, plant) %>%
fsummarise(avg_change = fmean(change)) %>%
roworder(plant)
-输出
# trt plant avg_change
#1 1 1 -7.5
#2 2 1 1.5
#3 3 1 7.5
#4 1 2 11.5
#5 2 2 19.5
#6 3 2 32.5
#7 1 3 9.5
#8 2 3 1.5
#9 3 3 15.0
#10 1 4 4.5
#11 2 4 2.0
#12 3 4 16.0
#13 1 5 3.5
#14 2 5 5.0
#15 3 5 11.0
使用 aggregate
的基础 R 解决方案
> aggregate(change ~ ., df, mean)
trt plant change
1 1 1 -7.5
2 2 1 1.5
3 3 1 7.5
4 1 2 11.5
5 2 2 19.5
6 3 2 32.5
7 1 3 9.5
8 2 3 1.5
9 3 3 15.0
10 1 4 4.5
11 2 4 2.0
12 3 4 16.0
13 1 5 3.5
14 2 5 5.0
15 3 5 11.0
trt<-c(1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3 ,3)
plant<-c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5 ,5, 5, 5)
change<-c(-9, -6, -4 , 7 , 4, 11, 18, 5, 29, 10, 29, 36, 10, 9, 4, -1 ,14 ,16 , 9 , 0, -2, 6,14, 18, -6, 13, 11, -1, 7, 15)
df<-data.frame(trt,plant,change)
我想要这样的结果——trt 中前 2 个条目相同的变化的平均值。 我的数据有 30 行,我想要 15 行结果,请帮助
我们可以通过总结来做一个小组
library(dplyr)
df %>%
group_by(trt, plant) %>%
summarise(avg_change = mean(change, na.rm = TRUE), .groups = 'drop') %>%
arrange(plant)
-输出
# A tibble: 15 x 3
# trt plant avg_change
# <dbl> <dbl> <dbl>
# 1 1 1 -7.5
# 2 2 1 1.5
# 3 3 1 7.5
# 4 1 2 11.5
# 5 2 2 19.5
# 6 3 2 32.5
# 7 1 3 9.5
# 8 2 3 1.5
# 9 3 3 15
#10 1 4 4.5
#11 2 4 2
#12 3 4 16
#13 1 5 3.5
#14 2 5 5
#15 3 5 11
或使用collapse
library(collapse)
df %>%
fgroup_by(trt, plant) %>%
fsummarise(avg_change = fmean(change)) %>%
roworder(plant)
-输出
# trt plant avg_change
#1 1 1 -7.5
#2 2 1 1.5
#3 3 1 7.5
#4 1 2 11.5
#5 2 2 19.5
#6 3 2 32.5
#7 1 3 9.5
#8 2 3 1.5
#9 3 3 15.0
#10 1 4 4.5
#11 2 4 2.0
#12 3 4 16.0
#13 1 5 3.5
#14 2 5 5.0
#15 3 5 11.0
使用 aggregate
> aggregate(change ~ ., df, mean)
trt plant change
1 1 1 -7.5
2 2 1 1.5
3 3 1 7.5
4 1 2 11.5
5 2 2 19.5
6 3 2 32.5
7 1 3 9.5
8 2 3 1.5
9 3 3 15.0
10 1 4 4.5
11 2 4 2.0
12 3 4 16.0
13 1 5 3.5
14 2 5 5.0
15 3 5 11.0