Alternative to expand.grid for data.frames

前端 未结 6 1486
误落风尘
误落风尘 2020-11-27 16:22

I have a data.frame df and I want that every row in this df is duplicated lengthTime times and that a new column is added that counts

6条回答
  •  一向
    一向 (楼主)
    2020-11-27 17:07

    A data.table solution:

    > library(data.table)
    >  ( df <- data.frame(ID   = rep(letters[1:3], each=3),
    +                  CatA = rep(1:3, times = 3),
    +                  CatB = letters[1:9]) )
      ID CatA CatB
    1  a    1    a
    2  a    2    b
    3  a    3    c
    4  b    1    d
    5  b    2    e
    6  b    3    f
    7  c    1    g
    8  c    2    h
    9  c    3    i
    > ( DT <- data.table(df)[, lapply(.SD, function(x) rep(x,3))][, Time:=rep(1:3, each=nrow(df0))] )
        ID CatA CatB Time
     1:  a    1    a    1
     2:  a    2    b    1
     3:  a    3    c    1
     4:  b    1    d    1
     5:  b    2    e    1
     6:  b    3    f    1
     7:  c    1    g    1
     8:  c    2    h    1
     9:  c    3    i    1
    10:  a    1    a    2
    11:  a    2    b    2
    12:  a    3    c    2
    13:  b    1    d    2
    14:  b    2    e    2
    15:  b    3    f    2
    16:  c    1    g    2
    17:  c    2    h    2
    18:  c    3    i    2
    19:  a    1    a    3
    20:  a    2    b    3
    21:  a    3    c    3
    22:  b    1    d    3
    23:  b    2    e    3
    24:  b    3    f    3
    25:  c    1    g    3
    26:  c    2    h    3
    27:  c    3    i    3
    

    Another one :

    > library(data.table)
    >  ( df <- data.frame(ID   = rep(letters[1:3], each=3),
    +                  CatA = rep(1:3, times = 3),
    +                  CatB = letters[1:9]) )
    > DT <- data.table(df)
    > rbindlist(lapply(1:3, function(i) cbind(DT, Time=i)))
        ID CatA CatB Time
     1:  a    1    a    1
     2:  a    2    b    1
     3:  a    3    c    1
     4:  b    1    d    1
     5:  b    2    e    1
     6:  b    3    f    1
     7:  c    1    g    1
     8:  c    2    h    1
     9:  c    3    i    1
    10:  a    1    a    2
    11:  a    2    b    2
    12:  a    3    c    2
    13:  b    1    d    2
    14:  b    2    e    2
    15:  b    3    f    2
    16:  c    1    g    2
    17:  c    2    h    2
    18:  c    3    i    2
    19:  a    1    a    3
    20:  a    2    b    3
    21:  a    3    c    3
    22:  b    1    d    3
    23:  b    2    e    3
    24:  b    3    f    3
    25:  c    1    g    3
    26:  c    2    h    3
    27:  c    3    i    3
    

提交回复
热议问题