Tôi có một lớn, rộng data.table
(hàng 20m) được khóa bằng ID người nhưng có nhiều cột (~ 150) có nhiều giá trị null. Mỗi cột là một trạng thái/thuộc tính được ghi lại mà tôi muốn chuyển tiếp cho mỗi người. Mỗi người có thể có từ 10 đến 10.000 quan sát và có khoảng 500.000 người trong bộ này. Giá trị từ một người không thể 'chảy máu' vào người sau, vì vậy giải pháp của tôi phải tôn trọng cột ID và nhóm người phù hợp.locf hiệu quả theo nhóm trong một dữ liệu R. Có thể
Đối với mục đích trình diễn - đây là một đầu vào mẫu rất nhỏ:
DT = data.table(
id=c(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3),
aa=c("A", NA, "B", "C", NA, NA, "D", "E", "F", NA, NA, NA),
bb=c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA),
cc=c(1, NA, NA, NA, NA, 4, NA, 5, 6, NA, 7, NA)
)
Nó trông như thế này:
id aa bb cc
1: 1 A NA 1
2: 1 NA NA NA
3: 1 B NA NA
4: 1 C NA NA
5: 2 NA NA NA
6: 2 NA NA 4
7: 2 D NA NA
8: 2 E NA 5
9: 3 F NA 6
10: 3 NA NA NA
11: 3 NA NA 7
12: 3 NA NA NA
sản lượng dự kiến của tôi trông như thế này:
id aa bb cc
1: 1 A NA 1
2: 1 A NA 1
3: 1 B NA 1
4: 1 C NA 1
5: 2 NA NA NA
6: 2 NA NA 4
7: 2 D NA 4
8: 2 E NA 5
9: 3 F NA 6
10: 3 F NA 6
11: 3 F NA 7
12: 3 F NA 7
tôi đã tìm thấy một giải pháp data.table
hoạt động, nhưng nó rất chậm trên các tập dữ liệu lớn của tôi:
DT[, na.locf(.SD, na.rm=FALSE), by=id]
Tôi đã tìm thấy các giải pháp tương đương bằng cách sử dụng dplyr cũng chậm như nhau.
GRP = DT %>% group_by(id)
data.table(GRP %>% mutate_each(funs(blah=na.locf(., na.rm=FALSE))))
Tôi đã hy vọng rằng tôi có thể đưa ra một 'tự' cán tham gia sử dụng các chức năng data.table
, nhưng tôi chỉ dường như không thể làm cho nó đúng (tôi nghi ngờ tôi sẽ cần phải sử dụng .N
nhưng tôi chỉ đã không tìm ra nó).
Tại thời điểm này, tôi nghĩ tôi sẽ phải viết một cái gì đó trong Rcpp để áp dụng hiệu quả locf nhóm.
Tôi mới sử dụng R, nhưng tôi không quen với C++ - vì vậy tôi tự tin mình có thể làm được. Tôi chỉ cảm thấy như có một cách hiệu quả để làm điều này trong R sử dụng data.table
.
Tôi khá chắc chắn 'DT [, lapply (.SD, na.locf, F), bởi = id] 'sẽ nhanh hơn – eddi
Tôi thực sự bắt đầu với điều đó và thấy hiệu suất tồi tệ hơn. –
Rolling self join có vẻ là điểm ở đây, tôi nhớ một số câu hỏi có cả hai 'na.locf' và rolling join answers, vì vậy tôi nghĩ bạn có thể tìm thấy câu trả lời trong cơ sở kiến thức SO hiện tại. – jangorecki