代码之家  ›  专栏  ›  技术社区  ›  Peter Chen

带组的年份序列

  •  2
  • Peter Chen  · 技术社区  · 6 年前

    我想创建一个新的列,从2003年到2006年的序列年,每个组。

    # dt
    NAME    ID    col3
    AAA      1      SB
    ABC      2      LA
    CCC      3      AL
    

    我想要的是:

    NAME    ID    col3    Year
    AAA      1      SB    2003
    AAA      1      SB    2004
    AAA      1      SB    2005
    AAA      1      SB    2006
    ABC      2      LA    2003
    ABC      2      LA    2004
    ABC      2      LA    2005
    ABC      2      LA    2006
    CCC      3      AL    2003
    CCC      3      AL    2004
    CCC      3      AL    2005
    CCC      3      AL    2006
    

    我试过这个:

    dt[rep(1:.N, 4)][, Year := seq(2003, 2006), by = .(NAME, ID)]
    

    我得到了结果。我想知道有没有更好的解决办法?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Maurits Evers    6 年前

    使用 data.table 你可以做的

    dt[, .(Year = seq(2003, 2006)), by = .(NAME, ID, col3)]
    #   NAME ID col3 Year
    #1:  AAA  1   SB 2003
    #2:  AAA  1   SB 2004
    #3:  AAA  1   SB 2005
    #4:  AAA  1   SB 2006
    #5:  ABC  2   LA 2003
    #6:  ABC  2   LA 2004
    #7:  ABC  2   LA 2005
    #8:  ABC  2   LA 2006
    #9:  CCC  3   AL 2003
    #10:  CCC  3   AL 2004
    #11:  CCC  3   AL 2005
    #12:  CCC  3   AL 2006
    

    这里 .(...) 表达式是 list(...) 作为 j 争论。


    样本数据

    dt <- fread("NAME    ID    col3
    AAA      1      SB
    ABC      2      LA
    CCC      3      AL")
    
        2
  •  1
  •   akrun    6 年前

    这是另一个选择 crossing

    library(tidyr)
    crossing(dt, Year = 2003:2006)
    #    NAME ID col3 Year
    #1   AAA  1   SB 2003
    #2   AAA  1   SB 2004
    #3   AAA  1   SB 2005
    #4   AAA  1   SB 2006
    #5   BBB  2   LA 2003
    #6   BBB  2   LA 2004
    #7   BBB  2   LA 2005
    #8   BBB  2   LA 2006
    #9   CCC  3   AL 2003
    #10  CCC  3   AL 2004
    #11  CCC  3   AL 2005
    #12  CCC  3   AL 2006
    

    数据

    dt <- structure(list(NAME = structure(1:3, .Label = c("AAA", "BBB", 
     "CCC"), class = "factor"), ID = c(1, 2, 3), col3 = structure(3:1, .Label = c("AL", 
      "LA", "SB"), class = "factor")), class = "data.frame", row.names = c(NA, 
     -3L))
    
        3
  •  1
  •   amrrs    6 年前

    基于tidyverse的解决方案

    dt <- data.frame("NAME"= c("AAA","BBB","CCC"),
                        "ID"= c(1,2,3),
                        "col3" = c("SB","LA","AL"))
    
    
    library(tidyverse)
    #> Warning: package 'tibble' was built under R version 3.5.2
    
    dt %>% 
      group_by(NAME,ID,col3) %>% 
      expand(Year = seq(2003, 2006))
    #> # A tibble: 12 x 4
    #> # Groups:   NAME, ID, col3 [3]
    #>    NAME     ID col3   Year
    #>    <fct> <dbl> <fct> <int>
    #>  1 AAA       1 SB     2003
    #>  2 AAA       1 SB     2004
    #>  3 AAA       1 SB     2005
    #>  4 AAA       1 SB     2006
    #>  5 BBB       2 LA     2003
    #>  6 BBB       2 LA     2004
    #>  7 BBB       2 LA     2005
    #>  8 BBB       2 LA     2006
    #>  9 CCC       3 AL     2003
    #> 10 CCC       3 AL     2004
    #> 11 CCC       3 AL     2005
    #> 12 CCC       3 AL     2006
    

    创建于2019-01-24 reprex package (v0.2.1)

    expand() documentation