2015-05-01 22 views
12

Tôi có một bộ dữ liệu được cấu trúc như sau:hàng Nhân rộng trong data.table bởi giá trị cột

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 

tôi cần phải tái tạo mỗi hàng N = Tenure lần. ví dụ. Tôi cần phải tái tạo hàng đầu tiên 2 lần (kể từ Tenure = 2

tôi cần tập dữ liệu chuyển đổi của tôi để trông giống như sau:.

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ó cách nào hiệu quả hơn (một nhiều data.table chiều) để làm điều này ? cách của tôi là khá chậm tôi đã suy nghĩ nên có một cách để làm điều này bằng cách sử dụng kết hợp by-without-by usng .EACHI

Trả lời

15

Tôi không nghĩ rằng sử dụng một chìa khóa/merge là hữu ích ở đây. Chỉ cần mở rộng bằng cách chuyển vectơ của các chỉ mục hàng:

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

Thật đơn giản! Cám ơn rất nhiều! –

3

Bạn có thể thử:.?

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

Hoặc

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

Mà cho:

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 
Các vấn đề liên quan