根据列值将行添加到data.table

时间:2016-02-27 18:23:04

标签: r dataframe data.table

我正在使用大型数据集,我需要为其添加行。这个问题在另一个问题中提出,但我将这一特定问题与原始问题中的其他问题分开。我是新手,所以请告诉我这是不是“完成”的事情。

数据示例:

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   1   0   0
2016    5   2   2   8885.52 0   0   1   1   1   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和yr的每个组合,有几行对应于一周的数据。 p1:p3和f1:f4列是id / yr不变量,rev随周而变。

对于yr / id的每个组合,都有一周的最大值。我想要做的是添加缺少的行,从一周开始为一周= 1,直到该年/月组合的最大值。

我想最终:

yr  week    id  days    rev p1  p2  p3  f1  f2  f3  f4
2016    1   1   0   NA      0   1   0   0   0   0   0
2016    2   1   0   NA      0   1   0   0   0   0   0
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    9   1   0   NA      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    12  1   0   NA      0   1   0   0   0   0   0
2016    13  1   0   NA      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   1   0   0
2016    3   2   0   NA      0   0   1   1   1   0   0
2016    4   2   0   NA      0   0   1   1   1   0   0
2016    5   2   2   8885.52 0   0   1   1   1   0   0
2016    6   2   0   NA      0   0   1   1   1   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

我尝试过使用data.table包中的CJ,但问题是每个id / season组的连接都不同。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

使用dplyr(v0.4.3)和来自complete(v0.4.1)的tidyr函数进行分组应该可以解决问题:

library(dplyr)
library(tidyr)

df %>% 
  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)