我有一个类似以下的数据帧:
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