R 用更少的时间和内存重塑交替列

R 用更少的时间和内存重塑交替列,r,data.table,reshape,reshape2,R,Data.table,Reshape,Reshape2,我如何才能更快地进行此重塑,从而占用更少的内存?我的目标是用4GB内存重塑一个500000行乘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

我如何才能更快地进行此重塑,从而占用更少的内存?我的目标是用4GB内存重塑一个500000行乘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)

make_example我非常怀疑,在传递500000 x 500数据帧时,使用如此少量的RAM是否会成功。我想知道你是否能在有限的空间里做一些简单的动作。买更多的公羊。此外,整形2的速度很慢,所以使用stats::整形来处理大的东西。并给出关于分隔符是什么的提示

> set.seed(007)
> dat <- make_example(5, 3)
> dat
  docnum filename ntop_1     ptop_1 ntop_2    ptop_2 ntop_3    ptop_3
1      1    y8214      3 0.06564574      1 0.6799935      2 0.8470244
2      2    e6x39      2 0.62703876      1 0.2637199      3 0.4980761
3      3    34c19      3 0.49047504      3 0.1857143      3 0.7905856
4      4    1H0y6      2 0.97102441      3 0.1851432      2 0.8384639
5      5    P6zqy      3 0.36222085      3 0.3792967      3 0.4569039

> reshape(dat, direction="long", varying=3:8, sep="_")
    docnum filename time ntop       ptop id
1.1      1    y8214    1    3 0.06564574  1
2.1      2    e6x39    1    2 0.62703876  2
3.1      3    34c19    1    3 0.49047504  3
4.1      4    1H0y6    1    2 0.97102441  4
5.1      5    P6zqy    1    3 0.36222085  5
1.2      1    y8214    2    1 0.67999346  1
2.2      2    e6x39    2    1 0.26371993  2
3.2      3    34c19    2    3 0.18571426  3
4.2      4    1H0y6    2    3 0.18514322  4
5.2      5    P6zqy    2    3 0.37929675  5
1.3      1    y8214    3    2 0.84702439  1
2.3      2    e6x39    3    3 0.49807613  2
3.3      3    34c19    3    3 0.79058557  3
4.3      4    1H0y6    3    2 0.83846387  4
5.3      5    P6zqy    3    3 0.45690386  5

> system.time( dat <- make_example(5000,100) )
   user  system elapsed 
  2.925   0.131   3.043 
> system.time( dat2 <-  reshape(dat, direction="long", varying=3:202, sep="_"))
   user  system elapsed 
 16.766   8.608  25.272 
>设置种子(007)
>dat dat
文件名ntop_1 ptop_1 ntop_2 ptop_2 ntop_3 ptop_3
1 y8214 3 0.06564574 1 0.6799935 2 0.8470244
2 e6x39 2 0.62703876 1 0.2637199 3 0.4980761
3 34c19 3 0.49047504 3 0.1857143 3 0.7905856
4 H0Y6 0.97102441 0.1851432 0.8384639
5 P6zqy 3 0.36222085 3 0.3792967 3 0.4569039
>重塑(dat,direction=“long”,变化=3:8,sep=“389;”)
docnum文件名时间ntop ptop id
1.1 1 y8214 1 3 0.06564574 1
2.1 2 e6x39 1 2 0.62703876 2
3.1 3 34c19 1 3 0.49047504 3
4.1 4 H0Y6 0.97102441 4
5.1 5 P6zqy 1 3 0.36222085 5
1.2 1 y8214 2 1 0.67999346 1
2.2 2 e6x39 2 1 0.26371993 2
3.2 34c19 2 0.18571426 3
4.2 H0Y6 0.18514322 4
5.2 5 P6zqy 2 3 0.37929675 5
1.3 1 y8214 3 0.84702439 1
2.3 2 e6x39 3 0.49807613 2
3.3 34c19 3 0.79058557 3
4.3 H0Y6 0.83846387 4
5.3 5 P6zqy 3 0.45690386 5

>system.time(dat system.time)(dat2感谢您再次了解这一点。了解有关
stats::reforme
和分隔符的提示非常有用。注意,我将使用一台具有更多RAM的机器(或者可能在这一特定步骤中使用Perl,甚至与Julia打破僵局……).我明白你关于准确行为描述的意思,我正在报告我看到RStudio在做什么(实际上不知道R在做什么…)。再次感谢。
> set.seed(007)
> dat <- make_example(5, 3)
> dat
  docnum filename ntop_1     ptop_1 ntop_2    ptop_2 ntop_3    ptop_3
1      1    y8214      3 0.06564574      1 0.6799935      2 0.8470244
2      2    e6x39      2 0.62703876      1 0.2637199      3 0.4980761
3      3    34c19      3 0.49047504      3 0.1857143      3 0.7905856
4      4    1H0y6      2 0.97102441      3 0.1851432      2 0.8384639
5      5    P6zqy      3 0.36222085      3 0.3792967      3 0.4569039

> reshape(dat, direction="long", varying=3:8, sep="_")
    docnum filename time ntop       ptop id
1.1      1    y8214    1    3 0.06564574  1
2.1      2    e6x39    1    2 0.62703876  2
3.1      3    34c19    1    3 0.49047504  3
4.1      4    1H0y6    1    2 0.97102441  4
5.1      5    P6zqy    1    3 0.36222085  5
1.2      1    y8214    2    1 0.67999346  1
2.2      2    e6x39    2    1 0.26371993  2
3.2      3    34c19    2    3 0.18571426  3
4.2      4    1H0y6    2    3 0.18514322  4
5.2      5    P6zqy    2    3 0.37929675  5
1.3      1    y8214    3    2 0.84702439  1
2.3      2    e6x39    3    3 0.49807613  2
3.3      3    34c19    3    3 0.79058557  3
4.3      4    1H0y6    3    2 0.83846387  4
5.3      5    P6zqy    3    3 0.45690386  5

> system.time( dat <- make_example(5000,100) )
   user  system elapsed 
  2.925   0.131   3.043 
> system.time( dat2 <-  reshape(dat, direction="long", varying=3:202, sep="_"))
   user  system elapsed 
 16.766   8.608  25.272