问题描述
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)])
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();