4

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

例如a=5,如果b=3

我希望我能够获得与

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

如果a=3,b=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))

ieb是列数......并且a是间隔大小。

谢谢

编辑

理想情况下,我会输入a大约 100 和b大约 30 的数字,有没有什么东西可以快速且有效地产生内存……也许是某种形式data.table

4

4 回答 4

4

像这样的东西应该可以工作,使用replicatedo.call

exgrid <- function(a, b){
  do.call(expand.grid,replicate(b , seq(0,1,by = 1/a), simplify = FALSE))
}
于 2012-11-22T06:04:15.920 回答
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, ]
于 2012-11-22T10:29:20.227 回答
2

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

b <- 4    
expand.grid(rep(list(seq(0,1,by=1/3)), b))
于 2012-11-22T06:18:42.920 回答
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()情况下读取对象的时间会mtxexpand.ffgrid().

添加信息(数据大小):

> 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
于 2018-09-15T19:18:59.137 回答