为泊松回归操作数据 table:添加零行和滞后变量

Manipulating a data table for Poisson regression: adding rows of zeros and lagging variables

我正在处理一个捕鱼船队的大型数据集,我需要将其格式化以用于泊松回归和其他计数模型。有关数据的子集,请参见下文。计数变量是 'days'。 p1:p3为港口组指标变量,f1:f4为其他渔业指标变量activity.

yr   week   id  days rev    p1  p2 p3   f1  f2  f3  f4
2016    3   1   1   5568.3  0   1   0   0   0   0   0
2016    4   1   3   8869.53 0   1   0   0   0   0   0
2016    5   1   2   12025.8 0   1   0   0   0   0   0
2016    6   1   2   9126.6  0   1   0   0   0   0   0
2016    7   1   3   4415.4  0   1   0   0   0   0   0
2016    8   1   2   11586.6 0   1   0   0   0   0   0
2016    10  1   1   2144.4  0   1   0   0   0   0   0
2016    11  1   1   2183.25 0   1   0   0   0   0   0
2016    14  1   2   4998    0   1   0   0   0   0   0
2016    15  1   3   117     0   1   0   0   0   0   0
2016    1   2   4   12743.3 0   0   1   1   1   0   0
2016    2   2   2   7473.48 0   0   1   1   0   0   0
2016    5   2   2   8885.52 0   0   1   1   0   0   0
2016    7   2   1   15330.6 0   0   1   1   1   0   0
2016    8   2   2   3763.8  0   0   1   1   1   0   0
2016    9   2   1   2274.05 0   0   1   1   1   0   0

这些行仅代表活跃周数,但我需要合并每艘船的非活跃周数。例如,对于 id=1,在 2016 年 (yr),我需要添加从 week=1 开始的行,然后是第 9、12 和 13 周的行。这些行将需要在虚拟行中维护相同的信息类别(这些不会按年改变),并且在 'days' 列中有零。我不需要在该年份和容器的 'week' 的最后一个值之后添加行。

这就是事情变得非常复杂的地方:

在这些新创建的行的收入 (rev) 列中,我需要添加共享同一港口组 (p1:p3) 的所有船只在该周和该年的平均收入。

最后,我需要添加一个新的滞后收入列。对于每一行,滞后收入的值应该是该年该船前一周的 'rev' 列中的值。

每艘船第 1 周的价值应该是该船当年前两周收入的平均值。

这个任务把我的数据处理技能击得粉碎,我的头撞到墙上开始疼了。任何建议将不胜感激!谢谢

要按周、年、p1、p2 和 p3 获取平均收入,只需使用聚合函数:

average_rev <- aggregate(rev~week+year+p1+p2+p3, data=your_dataframe, FUN=mean)

要添加新的滞后收入列:

your_dataframe$lagged_rev <- c(NA, your_dataframe$rev[1:(nrow(_your_dataframe)-1)])

要获得过去两周的平均转化率:

your_dataframe$avg_rev <- rowMeans(your_dataframe[,c('rev','lagged_rev')])

感谢https://whosebug.com/users/3001626/david-arenburg, and https://whosebug.com/users/2802241/user2802241,问题已解决。您可以在以下位置的添加行部分看到 post:

test<-data.frame(DT %>% 
  group_by(yr, id) %>% 
  complete(week = 1:max(week)) %>% 
  replace_na(list(days = 0)) %>% 
  group_by(yr, id) %>% 
  mutate_each(funs(replace(., is.na(.), mean(., na.rm = T))), p1:f4))

    poisson<-data.table(test)
    setkey(poisson,yr,id,week)

    avrev<-poisson[,.(avrev = mean(rev,na.rm=T)),by=.(p1,p2,[p3,week,yr)]
    avrev<-transform(avrev,xyz=interaction(p1,p2,p3,week,yr,sep=''))
    poisson<-transform(poisson,xyz=interaction(tier200,tier300,tier500,week,yr,sep=''))
    poisson<-transform(poisson,uniqueid=interaction(drvid,season,sep=''))

    poisson$rev[is.na(poisson$rev)]<- avrev$avrev[match(poisson$xyz[is.na(poisson$rev)],avrev$xyz)]

    poisson[, lagrev:=c(rev[1], rev[-.N]), by=uniqueid]

我确信有更好更简洁的方法来完成任务,但这行得通。 David Arenburg 还在评论部分 post 编辑了一个答案,该答案利用 data.table 创建新行 - 请参阅其他 post.