计算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)))
,

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

的基本R选项
rbind(df,aggregate(df["value"],cbind(df["day"],year="avg"),FUN=mean))

或变体形式(通过评论中的@thelatemail)

  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

给出

linkTo(methodOn(UsersApi.class).retrieveUser(userId)).withSelfRel();