计算R中值的平均值,并将结果作为新行而不是新列添加



我有一个类似以下的数据帧:

day year    value
1   2014    5   
1   2015    16  
1   2016    0   
2   2014    3   
2   2015    1   
2   2016    4   

我想计算三年期间(2014年、2015年、2016年(的平均值。以下代码适用于此目的:

data  %>% 
group_by(day) %>% 
mutate(MEAN = mean(value)) 

并产生以下输出:

day year    value  MEAN
1   2014    5      7
1   2015    16     7
1   2016    0      7
2   2014    3      3
2   2015    1      3
2   2016    4      3

但我想将平均值添加为同一数据帧中的新行,如下所示:

day year    value
1   2014    5   
1   2015    16  
1   2016    0   
2   2014    3   
2   2015    1   
2   2016    4
1   avg     7 <--
2   avg     3 <--

关于我该怎么做,有什么建议吗?谢谢

我们可以使用summarise(而不是mutate,它在原始数据集中添加了一个新列(来计算mean,然后使用bind_rows可以与原始数据绑定。tidyverse函数对type非常特殊,所以在我们进行绑定之前,请确保class是相同的

library(dplyr)
data %>%
group_by(day) %>%
summarise(year = 'avg', value = mean(value)) %>% 
bind_rows(data %>% 
mutate(year = as.character(year)), .)
#  day year value
#1   1 2014  5.00
#2   1 2015 16.00
#3   1 2016  0.00
#4   2 2014  3.00
#5   2 2015  1.00
#6   2 2016  4.00
#7   1  avg  7.00
#8   2  avg  2.67

另一个选项是按"天"拆分,然后使用add_row(来自tibble(在每个list元素上创建新行

library(tibble)
library(purrr)
data %>% 
mutate(year = as.character(year)) %>% 
group_split(day) %>% 
map_dfr(~ .x %>% add_row(day = first(.$day),
year = 'avg', value = mean(.$value)))

以下是使用aggregate的基本R选项

rbind(df,cbind(aggregate(value~day,df,mean),year = "avg")[c(1,3,2)])

或变体(通过@thelatemail从评论中获得(

rbind(df, aggregate(df["value"], cbind(df["day"], year="avg"), FUN=mean))

它给出

day year     value
1   1 2014  5.000000
2   1 2015 16.000000
3   1 2016  0.000000
4   2 2014  3.000000
5   2 2015  1.000000
6   2 2016  4.000000
7   1  avg  7.000000
8   2  avg  2.666667