2015-05-01 4 views
12

У меня есть набор данных, который структурирован следующим образом:Репликация строки в 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 слияния usng .EACHI

ответ

15

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

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

Так просто! Спасибо! –

3

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

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 
Смежные вопросы