R - 如何为唯一组序列的缺失值添加行?

时间:2015-01-21 17:57:00

标签: r data.table plyr

我的问题类似于上一个问题Fastest way to add rows for missing values in a data.frame?

我无法弄清楚如何添加用" NA"填充的行。当最小值/最大值按组不同时。

> red<-data.frame(project = c(6, 6, 6, 6, 6, 9, 9, 9), period =c(1, 2, 5:7, 2, 4, 5), v3=letters[1:8], v4=c("red", "yellow", recursive = T))
> red
  project period v3     v4
1       6      1  a    red
2       6      2  b yellow 
3       6      5  c    red
4       6      6  d yellow
5       6      7  e    red
6       9      2  f yellow
7       9      4  g    red
8       9      5  h yellow

我希望它看起来像:

project period v3     v4
      6      1  a    red
      6      2  b yellow
      6      3 NA     NA
      6      4 NA     NA
      6      5  c    red
      6      6  d yellow
      6      7  e    red
      9      2  f yellow
      9      3 NA     NA
      9      4  g    red
      9      5  h yellow

当我使用

library(data.table)
DT=as.data.table(red)
setkey(DT, project, period)

DT[CJ(unique(project), seq(min(period), max(period)))]

它使每个项目组有7个时期;项目6应具有1-7期,但项目9应具有2-5期。

我试过摆弄.SD[ which.max(period)], by=project]但没有雪茄。

我认为它应该是seq()中的简单内容,但我试过seq(min(period, by=project))没有运气

谢谢!

3 个答案:

答案 0 :(得分:2)

DT[setkey(DT[, .(min(period):max(period)), by = project], project, V1)]
#    project period v3     v4
# 1:       6      1  a    red
# 2:       6      2  b yellow
# 3:       6      3 NA     NA
# 4:       6      4 NA     NA
# 5:       6      5  c    red
# 6:       6      6  d yellow
# 7:       6      7  e    red
# 8:       9      2  f yellow
# 9:       9      3 NA     NA
#10:       9      4  g    red
#11:       9      5  h yellow

答案 1 :(得分:2)

我不知道这是否是惯用的方式,但我能够通过首先创建一个索引,然后根据该索引对.SD中的正确行进行子集来实现所需的输出

DT[, indx := .GRP, project][, 
     .SD[CJ(unique(project), seq(min(period), max(period)))], indx]

#     indx project period v3     v4
#  1:    1       6      1  a    red
#  2:    1       6      2  b yellow
#  3:    1       6      3 NA     NA
#  4:    1       6      4 NA     NA
#  5:    1       6      5  c    red
#  6:    1       6      6  d yellow
#  7:    1       6      7  e    red
#  8:    2       9      2  f yellow
#  9:    2       9      3 NA     NA
# 10:    2       9      4  g    red
# 11:    2       9      5  h yellow

答案 2 :(得分:2)

接受的答案不起作用了(不再?),但它很接近。

setkey(DT,project,period)
DT[setkey(DT[, .(min(period):max(period)), by = project], project, V1)]

注意:1。您需要将周期序列放入列表才能工作。 2. @MiamiCG,我猜你需要允许笛卡儿,因为没有先把桌面键起来。如果将其设置为TRUE,则不会显示错误消息,但结果将不正确。

更新:@eddi更新了他的答案以匹配我的,所以它正在运作。