Tôi cần tính toán các phương tiện có trọng số cho mỗi hàng (6M + hàng), nhưng phải mất rất nhiều thời gian. Cột có trọng số là trường ký tự, vì vậy không thể sử dụng trọng số.chức năng data.table cho mỗi hàng quá chậm
nền dữ liệu:
library(data.table)
library(stringr)
values <- c(1,2,3,4)
grp <- c("a", "a", "b", "b")
weights <- c("{10,0,0,0}", "{0,10,0,0}", "{10,10,0,0}", "{0,0,10,0}")
DF <- data.frame(cbind(grp, weights))
DT <- data.table(DF)
string.weighted.mean <- function(weights.x) {
tmp.1 <- na.omit(as.numeric(unlist(str_split(string=weights.x, pattern="[^0-9]+"))))
tmp.2 <- weighted.mean(x=values, w=tmp.1)
}
Sau đây là cách nó có thể được thực hiện (quá chậm) với data.frames:
DF$wm <- mapply(string.weighted.mean, DF$weights)
này không được công việc nhưng là cách quá chậm (giờ):
DT[, wm:=mapply(string.weighted.mean, weights)]
Làm cách nào để dòng cuối cùng được sửa lại để tăng tốc?
Bạn có câu trả lời tuyệt vời. Chỉ cần thêm: Tôi đấu tranh để suy nghĩ của một định dạng đầu vào tồi tệ hơn. Nếu có thể sử dụng cột danh sách để lưu trữ trọng số dưới dạng vectơ số và hiệu quả không bao giờ _ever_ lặp lại theo hàng, luôn theo cột. Và một ma trận có thể tốt hơn trong các nhiệm vụ như thế này hơn data.table. –