我該如何做到這一點重塑更快,並使其佔用更少的內存?我的目標是用4 Gb RAM重新塑造500,000行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)?
感謝您再次看看這個。關於'stats :: reshape'和分隔符的提示很有用。採取的措施是,我將使用內存更多的機器(或者可以使用Perl來完成這個特定的步驟,甚至可以用茱莉亞打破僵局......)。我明白你的意思是關於準確的行爲描述,我正在報告我看到RStudio在做什麼(實際上不知道R在做什麼......)。再次感謝。 – Ben 2013-05-12 04:43:14