使用ddply在纵向数据中聚合不规则的时间段

时间:2014-03-17 23:08:16

标签: r

我正在寻找适应两个现有脚本的帮助。

我正在使用纵向数据集,并在一段时间内聚合一个关键变量。我有weeksmonths的变量。我能够对weeksmonths进行汇总 - 但我的目标是在前六周汇总数周,然后转到聚合几个月 6周+

按周数和月数汇总很容易......

  

df.summary_week< - ddply(df,。(周),总结,                       var.mean = mean(var,na.rm = T))

产生的结果如下:

weeks    var.mean
1        3.99
2        5.44
3        6.7
4        8.100
5        2.765
6        2.765
7        3.765
8        4.765
9        1.765
10       4.765
11       1.765

然后按月汇总会产生类似的结果:

  

df.summary_months< - ddply(df,。(月),总结,                       var.mean = mean(var,na.rm = T))

months    var.mean
1        5.00
2        3.001
3        4.7
4        7.100

我最初的想法是简单地使用切割点对两个数据集进行子集化然后将它们绑定在一起,但是当1个月聚合在6周开始而不是8周时,我不知道如何做到这一点。

思考,R巫师?

2 个答案:

答案 0 :(得分:0)

基本示例数据。

dat <- data.frame(var=1:24,weeks=1:24,months=rep(1:6,each=4))

前6格的手段应该只是1:6,那么手段就是值 随后的4周时间。例如。 (平均(7:10)= 8.5等)。

制作一个合适的群组标识符,从几周到几个月:

dat$grp <- findInterval(dat$weeks,seq(7,max(dat$weeks),4)) + 6
dat$grp <- ifelse(dat$grp==6,dat$weeks,dat$grp)
#[1]  1  2  3  4  5  6  7  7  7  7  8  8  8  8  9  9  9  9 10 10 10 10 11 11

对数据进行分组:

ddply(dat, .(grp), summarise, var.mean = mean(var,na.rm=T))

   grp var.mean
1    1      1.0
2    2      2.0
3    3      3.0
4    4      4.0
5    5      5.0
6    6      6.0
7    7      8.5
8    8     12.5
9    9     16.5
10  10     20.5
11  11     23.5

答案 1 :(得分:0)

如何创建新的分组列?

set.seed(1618)
dat <- data.frame(week = sample(1:26, 200, replace = TRUE), 
                  value = rpois(200, 2))

dat <- within(dat, {
  idx <- cut(week, c(0, 6, seq(10, max(week), by = 4)))
})
# head(dat)
#   week value     idx
# 1    6     1   (0,6]
# 2   16     2 (14,18]
# 3    9     1  (6,10]
# 4   13     2 (10,14]
# 5    8     2  (6,10]
# 6   16     2 (14,18]

library(plyr)
ddply(dat, .(idx), summarise, 
      mean = mean(value, na.rm = TRUE))
#       idx     mean
# 1   (0,6] 1.870968
# 2  (6,10] 2.259259
# 3 (10,14] 2.171429
# 4 (14,18] 1.931034
# 5 (18,22] 1.560000
# 6 (22,26] 1.954545

# checking a couple values
mean(dat[dat$week %in% 1:6, 'value'])
# [1] 1.870968
mean(dat[dat$week %in% 7:10, 'value'])
# [1] 2.259259
mean(dat[dat$week %in% 23:26, 'value'])
# [1] 1.954545