2015-04-21 5 views
0

У меня есть кадр данных с 1000 наблюдениями и 1 фиктивная переменная (которая принимает значение 0 или 1).Создайте все возможные комбинации в R

example = as.data.frame(rep(1, 1000)) 
names(example) = "Dummy" 
head(example) 
    Dummy 
1  1 
2  1 
3  1 
4  1 
5  1 
6  1 

Я хотел бы, чтобы генерировать все возможные комбинации для этих переменных «пустышек», так что кадр данных может выглядеть следующим образом:

 Dummy.1 Dummy.2 Dummy.3 ... Dummy.2^1000 
    1  1  1  1 ...   0 
    2  1  1  1 ...   0 
    3  1  1  1 ...   0 
    4  1  1  1 ...   0 
    5  1  1  0 ...   0 
    6  1  0  0 ...   0 
    .  .  .  . ...   . 
    .  .  .  . ...   . 
    .  .  .  . ...   . 
    1000 1  0  1 ...   0 

Помните, что у меня есть 1000 наблюдений и каждое наблюдение может взять значение 0 или 1, поэтому я должен иметь 2^1000 столбцов.

+2

Если вы рассматриваете все комбинации, вы должны получить 1000^2 столбца, правильно? – goodtimeslim

+0

Я думал, что переменная принимает только 2 возможных значения (0 или 1), таким образом, 2 * 1000 = 2000. Если переменная принимает 1000 возможных значений, то у меня может быть 1000 * 1000 столбцов – Xiaowai

+2

. Для вашего первого номера у вас есть два варианта: 0 или 1. Для вашего второго номера у вас есть два варианта: 0 или 1. Если вы их объединяете, у вас есть в общей сложности 2^2 = 4 варианта, 00, 01, 10, 11. – goodtimeslim

ответ

0

Вот сценарий, который можно сделать для 6 наблюдений, в результате чего получается data.frame с 2^6 = 64 столбцами, которые охватывают все перестановки нулей и единиц для 6 бит. Этот метод можно масштабировать до предела доступной памяти.

Сначала создайте векторы и добавить к data.frame в виде столбцов:

p = as.vector(apply(expand.grid(0:1,0:1,0:1,0:1,0:1,0:1), 1, paste0, collapse="")) 
v1 <- as.numeric(substring(p[1], seq(1,nchar(p[1]),1), seq(1,nchar(p[1]),1))) 
df <- cbind(v1) # this gets the data.frame started right 
for (i in 2:length(p)) { 
    df <- cbind(df,as.numeric(substring(p[i], seq(1,nchar(p[i]),1), seq(1,nchar(p[i]),1)))) 
     # assign proper colnames later 
} 

Наконец создавать имена столбцов для data.frame и вставить их:

cn = c() 
for (i in 1:64) { 
    n <- paste0("v",i) 
    cn <- c(cn,n) 
} 
colnames(df) <- cn 

Почти все параметризируется - - за исключением того, чтобы сделать это для 1000 наблюдений, измените значение 64 на 2-м шаге до 1000, и на первом этапе будет проще развернуть серию 0: 1, ... путем вырезания и вставки ее на длину 10, затем сделайте это в течение 10 10 раз и для получения 100 еще 10 раз.

1000 наблюдений потребуют 1.07150860718626732094842504906e + 301 столбцов на 1000 строк для 1.07150860718626732094842504906e + 304 ячеек на 4-8 байт каждых, который приходит на 4.28603442874506928379370019624e + 280 иоттабайта на нижнем конце.