Подтвердить что ты не робот

Репликация строк в data.table по значению столбца

У меня есть набор данных, который структурирован следующим образом:

data <- data.table(ID=1:10,Tenure=c(2,3,4,2,1,1,3,4,5,2),Var=rnorm(10))

    ID Tenure         Var
 1:  1      2 -0.72892371
 2:  2      3 -1.73534591
 3:  3      4  0.47007030
 4:  4      2  1.33173044
 5:  5      1 -0.07900914
 6:  6      1  0.63493316
 7:  7      3 -0.62710577
 8:  8      4 -1.69238758
 9:  9      5 -0.85709328
10: 10      2  0.10716830

Мне нужно реплицировать каждую строку N = Tenure раз. например Мне нужно повторить первую строку 2 раза (с Tenure = 2.

Мне нужен мой преобразованный набор данных, чтобы он выглядел следующим образом:

setkey(data,ID)
print(data[,.(ID=rep(ID,Tenure))][data][, Indx := 1:.N, by=ID])

   ID Tenure        Var Indx
1:  1      2 -0.7289237    1
2:  1      2 -0.7289237    2
3:  2      3 -1.7353459    1
4:  2      3 -1.7353459    2
5:  2      3 -1.7353459    3
6:  3      4  0.4700703    1
...
...

Есть ли более эффективный способ (более data.table) для этого? Мой путь довольно медленный. Я думал, что должен быть способ сделать это, используя by-without-by merge usng .EACHI?

4b9b3361

Ответ 1

Я не думаю, что использование ключа/слияния полезно здесь. Просто расширьте, передав вектор индексов строк:

DT <- data[rep(1:.N,Tenure)][,Indx:=1:.N,by=ID]

Ответ 2

Вы можете попробовать:

library(splitstackshape)
expandRows(data, "Tenure", drop = FALSE)[,Indx:=1:.N,by=ID][]

или

library(dplyr)
library(splitstackshape)
expandRows(data, "Tenure", drop = FALSE) %>% 
  group_by(ID) %>%
  mutate(Indx = row_number(Tenure))

Что дает:

    ID Tenure        Var Indx
 1:  1      2 -0.8808717    1
 2:  1      2 -0.8808717    2
 3:  2      3  0.5962590    1
 4:  2      3  0.5962590    2
 5:  2      3  0.5962590    3
 6:  3      4  0.1197176    1
 7:  3      4  0.1197176    2
 8:  3      4  0.1197176    3
 9:  3      4  0.1197176    4
10:  4      2 -0.2821739    1