组的年份顺序

时间:2019-01-24 04:38:31

标签: r data.table replication data-manipulation

我想创建一个新列,每个年份分别从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 个答案:

答案 0 :(得分:3)

使用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")

答案 1 :(得分:1)

基于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

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

expand() documentation

答案 2 :(得分:1)

这里是equals

的另一个选项
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