2015-05-01 4 views
12

Ho un insieme di dati che è strutturato come segue:replicatori righe data.table di valore colonna

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 

Ho bisogno di replicare ogni riga N = Tenure volte. per esempio. Ho bisogno di replicare i prima fila 2 volte (dal Tenure = 2

ho bisogno del mio gruppo di dati trasformata per assomigliare alla seguente:.

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

C'è un modo più efficiente (un data.table modo più) per fare questo ? il mio modo è piuttosto lento pensavo ci dovrebbe essere un modo per fare questo si utilizza un merge by-without-by usng .EACHI

risposta

15

non credo che utilizzando una chiave/unione è utile qui. Basta espandere passando un vettore di indici di riga:

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

Così semplice! Grazie mille! –

3

si potrebbe provare:.?

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

O

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

che dà:

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