可能是一个非常简单的问题,但我希望能够设置变量a
and b
,以便能够从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))
即b
是列数....而a
是区间大小。
谢谢
编辑
理想情况下,我会为a
提供大约100的数字和b
大约30是有一些快速和记忆效率的产生......也许是形式data.table
?
这样的事情应该有效,使用replicate
和do.call
exgrid <- function(a, b){
do.call(expand.grid,replicate(b , seq(0,1,by = 1/a), simplify = FALSE))
}
这将生成一个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, ]
我相信这会让你接近你所需要的:
b <- 4
expand.grid(rep(list(seq(0,1,by=1/3)), b))
> 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