この再形成をより速く、より少ないメモリで行うにはどうすればよいですか? 私の目的は、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 秒 (2 番目のステップでクラッシュ)
make_example(500000,500)
= まだできません...
この reshape ( data.table
、this ) に対して、より高速でメモリの消費量が少ない他の方法はありますか?