Expand.grid结果对于工作空间来说太大了;迭代计算?

时间:2016-03-02 17:33:25

标签: r

我的问题如下。我需要为27个抽样序列生成二元结果的组合,即000000000000000000000000000,000000000000000000000000001,...,111111111111111111111111111。

在R中,我会使用expand.grid

执行此操作
result <- expand.grid(rep(list(0:1), 27)) #Error, object too large for workspace
# 2^27 = 134217728 unique combinations
# write.table(result, "result.csv", row.names=F)

我的最终目标是保存生成的对象供以后使用。

有没有办法迭代计算result对象的条目并通过追加保存?

知道如何实现这个目标吗?

1 个答案:

答案 0 :(得分:0)

您也可以在C ++中使用std::bitset(请参阅Changing integer to binary string of digits)。

toBinString.cpp

#include <Rcpp.h>
#include <bitset>
using namespace Rcpp;
// [[Rcpp::export]]
std::string toBinString(int x){
  std::string s1 = std::bitset< 27 >(x).to_string();
  return s1;
}

在R中,执行:

> library(Rcpp)
> sourceCpp(file="toBinString.cpp")
> sapply(1:4,toBinString)
[1] "000000000000000000000000001" "000000000000000000000000010"
[3] "000000000000000000000000011" "000000000000000000000000100"
> toBinString(2^27-1)
[1] "111111111111111111111111111"
> strsplit(toBinString(2^27-1),"")
[[1]]
 [1] "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1" "1"
[20] "1" "1" "1" "1" "1" "1" "1" "1"

或者,使用cppFunction

在R中执行所有操作
cppFunction('std::string toBinString(int x)
  { return(std::bitset<27>(x).to_string()); }',
  includes="#include <bitset>")