有效地创建一个x b扩展的网格内存

问题描述 投票:4回答:4

可能是一个非常简单的问题,但我希望能够设置变量aand b,以便能够从R中的expand.grid创建data.frame或data.table。

例如如果a=5b=3

我希望我能够获得相同的输出

expand.grid(seq(0,1,by=1/5),seq(0,1,by=1/5), seq(0,1,by=1/5))

如果a=3b=4我会得到

expand.grid(seq(0,1,by=1/3), seq(0,1,by=1/3), seq(0,1,by=1/3), seq(0,1,by=1/3))

b是列数....而a是区间大小。

谢谢

编辑

理想情况下,我会为a提供大约100的数字和b大约30是有一些快速和记忆效率的产生......也许是形式data.table

r memory memory-management data.table
4个回答
4
投票

这样的事情应该有效,使用replicatedo.call

exgrid <- function(a, b){
  do.call(expand.grid,replicate(b , seq(0,1,by = 1/a), simplify = FALSE))
}

3
投票

这将生成一个100.Mio行的data.frame(ffdf),没有内存问题。它使用包ff。您可以根据需要增加列。请注意,如果您使用列,这可以生成相当多的数据。

require(ffbase)
x <- expand.ffgrid(ff(1:1000), ff(1:1000), ff(1:100))
dim(x)
x[1:5, ]

2
投票

我相信这会让你接近你所需要的:

b <- 4    
expand.grid(rep(list(seq(0,1,by=1/3)), b))

0
投票
> require('ffbase')
> require('BioGeoBEARS')

#https://www.rdocumentation.org/packages/BioGeoBEARS/versions/0.2.1/topics/expand.grid.jc
> system.time(mtx <- expand.ffgrid(ff(mcS$from), ff(mcS$to)))
#user  system elapsed 
#4.45    3.30    9.74 

> system.time(mtx <- expand.grid(mcS$from, mcS$to))
#user  system elapsed 
#1.92    0.25    2.18 

> system.time(mtx <- expand.grid.alt(mcS$from, mcS$to))
#user  system elapsed 
#8.05    0.95    9.03 

> system.time(mtx <- expand.grid.jc(mcS$from, mcS$to))
#user  system elapsed 
#0.44    0.17    0.61 

虽然评估的时间更快,但正常的expand.grid()需要更长的时间来阅读mtx对象而不是expand.ffgrid()

添加信息(datasize):

> as_data_frame(mtx)
# A tibble: 100,000,000 x 2
    from    to
   <int> <int>
 1   101   126
 2   126   126
 3   192   126
 4    19   126
 5    66   126
 6    82   126
 7   143   126
 8     1   126
 9    88   126
10   168   126
# ... with 99,999,990 more rows
© www.soinside.com 2019 - 2024. All rights reserved.