r-获取每n行的平均值,不分组

  • 本文关键字:平均值 获取 r date
  • 更新时间 :
  • 英文 :


我的数据(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

相关内容

  • 没有找到相关文章

最新更新