Tôi có một khung dữ liệu lớn với cột yếu tố mà tôi cần chia thành ba cột yếu tố bằng cách tách các tên hệ số bằng dấu tách. Đây là cách tiếp cận hiện tại của tôi, rất chậm với khung dữ liệu lớn (đôi khi vài triệu hàng):Tăng tốc `strsplit` khi đầu ra có thể được biết là
data <- readRDS("data.rds")
data.df <- reshape2:::melt.array(data)
head(data.df)
## Time Location Class Replicate Population
##1 1 1 LIDE.1.S 1 0.03859605
##2 2 1 LIDE.1.S 1 0.03852957
##3 3 1 LIDE.1.S 1 0.03846853
##4 4 1 LIDE.1.S 1 0.03841260
##5 5 1 LIDE.1.S 1 0.03836147
##6 6 1 LIDE.1.S 1 0.03831485
Rprof("str.out")
cl <- which(names(data.df)=="Class")
Classes <- do.call(rbind, strsplit(as.character(data.df$Class), "\\."))
colnames(Classes) <- c("Species", "SizeClass", "Infected")
data.df <- cbind(data.df[,1:(cl-1)],Classes,data.df[(cl+1):(ncol(data.df))])
Rprof(NULL)
head(data.df)
## Time Location Species SizeClass Infected Replicate Population
##1 1 1 LIDE 1 S 1 0.03859605
##2 2 1 LIDE 1 S 1 0.03852957
##3 3 1 LIDE 1 S 1 0.03846853
##4 4 1 LIDE 1 S 1 0.03841260
##5 5 1 LIDE 1 S 1 0.03836147
##6 6 1 LIDE 1 S 1 0.03831485
summaryRprof("str.out")
$by.self
self.time self.pct total.time total.pct
"strsplit" 1.34 50.00 1.34 50.00
"<Anonymous>" 1.16 43.28 1.16 43.28
"do.call" 0.04 1.49 2.54 94.78
"unique.default" 0.04 1.49 0.04 1.49
"data.frame" 0.02 0.75 0.12 4.48
"is.factor" 0.02 0.75 0.02 0.75
"match" 0.02 0.75 0.02 0.75
"structure" 0.02 0.75 0.02 0.75
"unlist" 0.02 0.75 0.02 0.75
$by.total
total.time total.pct self.time self.pct
"do.call" 2.54 94.78 0.04 1.49
"strsplit" 1.34 50.00 1.34 50.00
"<Anonymous>" 1.16 43.28 1.16 43.28
"cbind" 0.14 5.22 0.00 0.00
"data.frame" 0.12 4.48 0.02 0.75
"as.data.frame.matrix" 0.08 2.99 0.00 0.00
"as.data.frame" 0.08 2.99 0.00 0.00
"as.factor" 0.08 2.99 0.00 0.00
"factor" 0.06 2.24 0.00 0.00
"unique.default" 0.04 1.49 0.04 1.49
"unique" 0.04 1.49 0.00 0.00
"is.factor" 0.02 0.75 0.02 0.75
"match" 0.02 0.75 0.02 0.75
"structure" 0.02 0.75 0.02 0.75
"unlist" 0.02 0.75 0.02 0.75
"[.data.frame" 0.02 0.75 0.00 0.00
"[" 0.02 0.75 0.00 0.00
$sample.interval
[1] 0.02
$sampling.time
[1] 2.68
Có cách nào để tăng tốc hoạt động này không? Tôi lưu ý rằng có một số nhỏ (< 5) của mỗi danh mục "Loài", "Kích thước" và "Bị nhiễm" và tôi biết những điều này là trước.
Ghi chú:
stringr::str_split_fixed
thực hiện nhiệm vụ này, nhưng không phải bất kỳ nhanh- Khung dữ liệu được thực sự ban đầu được tạo ra bằng cách gọi
reshape::melt
trên một mảng trong đóClass
và mức độ liên quan của nó là một kích thước. Nếu có một cách nhanh hơn để đi từ đó đến đây, thật tuyệt. data.rds
tại http://dl.getdropbox.com/u/3356641/data.rds
Nhanh quá! Mặc dù bạn đã sử dụng 'as.character (Class)'. Bạn có thể trả về các cột dưới dạng các thừa số trong cùng một lệnh không? –
Bạn có thể chuyển đổi thành yếu tố, nhưng sau đó thực hiện như một dòng thứ hai. Sử dụng as.factor trong cùng một cuộc gọi bao gồm đối số 'by' nhất thiết sẽ làm chậm quá trình. –
@NoamRoss, bắt đẹp trên 'as.character'. Cập nhật mã cộng với một vài bước bổ sung –