【问题标题】:R - How to add rows for missing values for unique group sequences?R - 如何为唯一组序列的缺失值添加行?
【发布时间】:2015-03-20 08:35:43
【问题描述】:

我的问题和上一个问题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)) 却没有运气

谢谢!

【问题讨论】:

    标签: r data.table plyr


    【解决方案1】:
    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
    

    【讨论】:

    • 另外,对于像我一样阅读本文的新手,我在导出表格以包含 N/A 行时遇到了麻烦。我不得不发出命令DT=DT[setkey... 然后write.table(DT, "file.txt")
    • 谢谢你们!每个答案都有效。我的“期间”列中有一些重复值,所以我不得不使用“allow.cartesian = TRUE”:DT[setkey(DT[,min(period):max(period), by = project], project, V1), allow.cartesian=TRUE]
    • @AdrienA。固定
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

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

      注意:1.您需要将句点序列放入列表中才能工作。 2.@MiamiCG,我猜你需要允许笛卡尔,因为没有先键入表格。如果设置为TRUE,则不会出现错误信息,但结果会不正确。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-11
        • 2021-07-06
        • 2020-02-19
        • 2019-07-18
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 2018-12-25
        相关资源
        最近更新 更多