我的数据(df(看起来与这个相似
date日期日期日期日期地址1地址2地址 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
2015年01月01日 | 2015-01-02 | 2015-01-03 | 2015年01月4日 | 2015-01-05 | 2015-01-06 |
您可以每3行创建一组,并取所有"地址";列-
library(dplyr)
df %>%
mutate(date = as.Date(date)) %>%
group_by(grp = ceiling(row_number()/3)) %>%
summarise(date = last(date),
across(starts_with('address'), mean, na.rm = TRUE)) %>%
select(-grp)
# date address1 address2
# <date> <dbl> <dbl>
#1 2015-01-03 4 6
#2 2015-01-06 5 3
另一个选项是在3天前cut
,但它将给出组的开始日期。
df %>%
mutate(date = as.Date(date)) %>%
group_by(date = cut(date, '3 days')) %>%
summarise(across(starts_with('address'), mean, na.rm = TRUE))
下面的解决方案使用结尾注释中可重复显示的输入。前两个只使用基数R。第一个要求行数是3的倍数,但其他行没有这个限制。
1(rowsum创建一个分组向量date,并在第二个参数中使用它来进行rowsum,给出所示的数字矩阵。
nr <- nrow(df)
date <- df$date[ 3 * col(matrix(0, 3, nr/3)) ]
rowsum(df[-1], date) / 3
## address1 address2
## 2015-01-03 4 6
## 2015-01-06 5 3
2(聚合或者使用提供3列数据帧的聚合。
nr <- nrow(df)
date <- ave(df$date, seq(0, length = nr) %/% 3, FUN = max)
aggregate(df[-1], data.frame(date), mean)
## date address1 address2
## 1 2015-01-03 4 6
## 2 2015-01-06 5 3
3(collap可以使用collap包中的collap代替骨料。日期为(2(。
library(collapse)
collap(df[-1], date)
## date address1 address2
## 1 2015-01-03 4 6
## 2 2015-01-06 5 3
4(data.table使用data.table和date-from(2(返回data.table(也是一个数据帧(。
library(data.table)
as.data.table(df[, -1])[, lapply(.SD, mean), by = .(date)]
## date address1 address2
## 1: 2015-01-03 4 6
## 2: 2015-01-06 5 3
注意
可复制形式的输入为:
df <-
structure(list(date = c("2015-01-01", "2015-01-02", "2015-01-03",
"2015-01-04", "2015-01-05", "2015-01-06"), address1 = c(2L, 3L,
7L, 3L, 9L, 3L), address2 = c(8L, 7L, 3L, 1L, 4L, 4L)), class = "data.frame", row.names = c(NA,
-6L))
具有aggregate
+ave
的另一个基本R选项
aggregate(
. ~ date,
transform(
df,
date = ave(date, ceiling(seq_along(date) / 3), FUN = max)
),
mean
)
给出
date address1 address2
1 2015-01-03 4 6
2 2015-01-06 5 3