Cho một danh sách a
vectơ chứa có độ dài bất bình đẳng và một vector b
có chứa một số yếu tố từ các vectơ trong a
, tôi muốn có được một vector chiều dài bằng nhau để b
chứa chỉ mục trong a
nơi phần tử trong b
trận (đây là một lời giải thích xấu tôi biết) ...cách nhanh nhận được chỉ số của trận đấu trong danh sách
các mã sau đây không được công việc:
a <- list(1:3, 4:5, 6:9)
b <- c(2, 3, 5, 8)
sapply(b, function(x, list) which(unlist(lapply(list, function(y, z) z %in% y, z=x))), list=a)
[1] 1 1 2 3
Thay thế sapply
với một vòng lặp for đạt được cùng một cours e
Vấn đề là mã này sẽ được sử dụng với danh sách và vectơ có độ dài trên 1000. Trên thực tế, chức năng này mất khoảng 15 giây (cả vòng lặp for và sapply
).
Có ai có ý tưởng làm thế nào để tăng tốc độ này, an toàn cho một cách tiếp cận song song không? Tôi đã không nhìn thấy một cách tiếp cận vectorized (và tôi không thể lập trình trong C, mặc dù đó có lẽ sẽ là nhanh nhất).
Edit:
sẽ chỉ nhấn mạnh nhã giải pháp sử dụng trận đấu Aaron() mà đã đưa ra một sự gia tăng tốc độ theo thứ tự của năm 1667 lần (15-0,009)
tôi mở rộng một chút vào nó để cho phép nhiều trận đấu (sự trở lại là sau đó một danh sách)
a <- list(1:3, 3:5, 3:7)
b <- c(3, 5)
g <- rep(seq_along(a), sapply(a, length))
sapply(b, function(x) g[which(unlist(a) %in% x)])
[[1]]
[1] 1 2 3
[[2]]
[1] 2 3
Thời gian chạy cho điều này là 0,169 mà được cho là khá chậm, nhưng mặt khác linh hoạt hơn
Bạn muốn thuật toán làm gì nếu phần tử 'b' xuất hiện trong nhiều phần tử' a'? Điều đó có thể xảy ra trong vấn đề thực tế của bạn không? –
Tôi nên xác định rằng ... Đó không phải là khả năng – ThomasP85