Годовая последовательность с группой - PullRequest
0 голосов
/ 24 января 2019

Я хочу создать новый столбец, порядковый год с 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 голосов
/ 24 января 2019

Используя data.table s, вы можете сделать

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")
0 голосов
/ 24 января 2019

Вот еще один вариант с 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

data

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))
0 голосов
/ 24 января 2019

Решение на основе 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 пакетом Представить (v0.2.1)

expand() документация

...