【问题标题】:Using ddply to aggregate over irregular time periods in longitudinal data使用 ddply 聚合纵向数据中不规则时间段
【发布时间】:2014-04-23 10:05:10
【问题描述】:

我正在寻求调整两个现有脚本的帮助。

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

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

df.summary_week

这会产生类似的东西:

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

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

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

想法,R 巫师?

【问题讨论】:

  • 您可以使用df[df$weeks>6,] 按月ddply,然后使用df[df$weeks<=6] 按周将其绑定到ddply-ing 的结果吗?
  • @thelatemail 我可能是错的,但第一个月难道不是该月第 3 周和第 4 周的双周汇总吗?我汇总的原因是由于每个存储桶中的 n ,所以双周平均值是行不通的:(
  • 是的。由于一个月有点不确定,您是否愿意从第 7 周开始将每 4 周汇总为一个“月”?
  • @thelatemail,所以“周”和“月”实际上是根据设定的起点和观测日期之间的天数差异计算得出的,然后四舍五入(按 . 5)。我认为在第 7 周后按 4 周汇总是可以的,因为正如您指出的那样,这是一门不精确的科学……但理想情况下,我可以设置不同的切点。

标签: r


【解决方案1】:

基本示例数据。

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

前 6 个 grps 的均值应仅为 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

【讨论】:

  • 我 100% 理解您的方法...但是收到一个错误,提示“to”不能是 NA、NaN 或无限。我检查以确保周数是数字,它是......想法? ——
  • @roody - 我猜max(dat$weeks) 会以某种方式返回 NA 或 Inf。您可以看到该示例适用于基本数据,因此您使用的输入数据中一定有一些时髦的东西。
【解决方案2】:

创建一个新的分组列怎么样?

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

【讨论】:

    猜你喜欢
    • 2021-03-17
    • 2015-06-04
    • 2016-01-10
    • 2020-06-06
    • 1970-01-01
    • 2021-06-11
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多