2015-05-01 9 views
12

mam zestaw danych, który jest skonstruowany w następujący:replikacyjne wiersze data.table od wartości kolumny

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 

muszę replikacji każdy wiersz N = Tenure razy. na przykład Muszę powtórzyć pierwszy wiersz 2 razy (od Tenure = 2

Potrzebuję przekształcony zbiór danych do wyglądać następująco:.

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 
... 
... 

Czy jest bardziej efektywny sposób (bardziej data.table sposób), aby to zrobić ? Moja droga jest dość powolny myślałem nie powinno być jakiś sposób, aby to zrobić za pomocą by-without-by seryjnej usng .EACHI

Odpowiedz

15

Nie sądzę przy użyciu klucza/scalanie jest pomocne tutaj. Po prostu rozwiń, przekazując wektor indeksów wierszy:

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

Tak prosty! Dzięki wielkie! –

3

można spróbować.?

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

Albo

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

Co daje:

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