Insert a row of NAs after each group of data using data.table

前端 未结 2 409
清歌不尽
清歌不尽 2021-01-18 02:40

I am trying to add a row of NAs after each group of data in R.

A similar question has been asked earlier. Insert a blank row after each group of data.

相关标签:
2条回答
  • 2021-01-18 03:12

    One way I could think of is to construct a vector first as follows:

    foo <- function(x) {
        o = order(rep.int(seq_along(x), 2L))
        c(x, rep.int(NA, length(x)))[o]
    }
    join_values = head(foo(unique(df_new$group)), -1L)
    # [1] "a" NA  "b" NA  "c" NA  "d"
    

    And then setkey() and join.

    setkey(setDT(df_new), group)
    df_new[.(join_values), allow.cartesian=TRUE]
    #     group xvalue yvalue
    #  1:     a     16      1
    #  2:    NA     NA     NA
    #  3:     b     17      2
    #  4:     b     18      3
    #  5:    NA     NA     NA
    #  6:     c     19      4
    #  7:     c     20      5
    #  8:     c     21      6
    #  9:    NA     NA     NA
    # 10:     d     22      7
    # 11:     d     23      8
    # 12:     d     24      9
    # 13:     d     25     10
    
    0 讨论(0)
  • 2021-01-18 03:13

    You could try

    df$group <- as.character(df$group)
    setDT(df)[, .SD[1:(.N+1)], by=group][is.na(xvalue), group:=NA][!.N]
    #     group xvalue yvalue
    #1:     a     16      1
    #2:    NA     NA     NA
    #3:     b     17      2
    #4:     b     18      3
    #5:    NA     NA     NA
    #6:     c     19      4
    #7:     c     20      5
    #8:     c     21      6
    #9:    NA     NA     NA
    #10:    d     22      7
    #11:    d     23      8
    #12:    d     24      9
    #13:    d     25     10
    

    Or as suggested by @David Arenburg

     setDT(df)[, indx := group][, .SD[1:(.N+1)], indx][,indx := NULL][!.N]
    

    Or

     setDT(df)[df[,.I[1:(.N+1)], group]$V1][!.N]
    

    Or it could be further simplified based on @eddi's comments

     setDT(df)[df[, c(.I, NA), group]$V1][!.N]
    
    0 讨论(0)
提交回复
热议问题