Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用ddply对纵向数据中的不规则时间段进行聚合_R - Fatal编程技术网

R 使用ddply对纵向数据中的不规则时间段进行聚合

R 使用ddply对纵向数据中的不规则时间段进行聚合,r,R,我正在寻找帮助,以适应两个现有的脚本 我正在处理一个纵向数据集,并在一段时间内聚合一个关键变量。我对周和月都有一个变量。我能够在周和月-但我的目标是在前六周内累计数周,然后在6周+后按月累计 按周和月进行聚合很容易 df.summary_week基本示例数据 dat <- data.frame(var=1:24,weeks=1:24,months=rep(1:6,each=4)) 创建一个新的分组列怎么样 set.seed(1618) dat <- data.frame(week

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

我正在处理一个纵向数据集,并在一段时间内聚合一个关键变量。我对
都有一个变量。我能够在<代码>周<代码>和<代码>月<代码>-但我的目标是在前六周内累计数周,然后在6周+后按月累计

按周和月进行聚合很容易

df.summary_week基本示例数据

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

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

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
set.seed(1618)

dat您是否可以使用
df[df$weeks>6,]
按月计算,然后使用
df将其与按周计算的结果相关联[df$weeks@thelatemail我可能是错的,但第一个月不就是一个月中第三周和第四周的两周累计吗?我之所以要累计,是因为每个桶中有n,所以两周平均值不起作用:(是的,因为一个月有点不确定,你愿意从第7周开始每4周将其合并为一个“月”吗?@thelatemail,因此“周”和“月”实际上是根据设定的起点和观察日期之间的天数差来计算的,然后四舍五入(0.5).我认为在第7周后4周进行聚合是可以的,因为正如你所指出的,这是一门不精确的科学…理想情况下,我可以设定不同的切点。我100%理解你的方法…但我得到一个错误,说“to”不能是NA、NaN或无限。我检查了一下,以确保周是数字,并且是…想法?–@roody-我的猜测是,
max(dat$weeks)
以某种方式返回NA或Inf。您可以看到该示例使用的是基本数据,因此您使用的输入数据中一定有一些古怪的东西。
dat <- data.frame(var=1:24,weeks=1:24,months=rep(1:6,each=4))
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
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