我怎样才能更快地进行重塑并减少内存占用?我的目标是用 4 Gb RAM 重塑一个 500,000 行 x 500 列的数据框。
这是一个可以生成一些可重现数据的函数:
make_example <- function(ndoc, ntop){
# doc numbers
V1 = seq(1:ndoc)
# filenames
V2 <- list("vector", size = ndoc)
for (i in 1:ndoc){
V2[i] <- paste(sample(c(rep(0:9,each=5),LETTERS,letters),5,replace=TRUE),collapse='')
}
# topic proportions
tvals <- data.frame(matrix(runif(1:(ndoc*ntop)), ncol = ntop))
# topic number
tnumvals <- data.frame(matrix(sample(1:ntop, size = ndoc*ntop, replace = TRUE), ncol = ntop))
# now make topic props and topic numbers alternating columns (rather slow!)
alternating <- data.frame(c(matrix(c(tnumvals, tvals), 2, byrow = T)) )
# make colnames for topic number and topic props
ntopx <- sapply(1:ntop, function(j) paste0("ntop_",j))
ptopx <- sapply(1:ntop, function(j) paste0("ptop_",j))
tops <- c(rbind(ntopx,ptopx))
# make data frame
dat <- data.frame(V1 = V1,
V2 = unlist(V2),
alternating)
names(dat) <- c("docnum", "filename", tops)
# give df as result
return(dat)
}
制作一些可重现的数据:
set.seed(007)
dat <- make_example(500000, 500)
这是我当前的方法(感谢https://stackoverflow.com/a/8058714/1036500):
library(reshape2)
NTOPICS = (ncol(dat) - 2 )/2
nam <- c('num', 'text', paste(c('topic', 'proportion'), rep(1:NTOPICS, each = 2), sep = ""))
system.time( dat_l2 <- reshape(setNames(dat, nam), varying = 3:length(nam), direction = 'long', sep = ""))
system.time( dat.final2 <- dcast(dat_l2, dat_l2[,2] ~ dat_l2[,3], value.var = "proportion" ) )
一些时间,只是reshape
因为这是最慢的一步:
make_example(5000,100)
= 82 秒
make_example(50000,200)
= 2855 秒(尝试第二步时崩溃)
make_example(500000,500)
= 还不可能...
data.table
对于这种重塑( ,this ) ,还有哪些其他方法更快且内存占用更少?