2016-10-27 4 views
1

Я хочу иметь возможные комбинации для различных предметов. Подумайте о том, что участники приносят один из трех предметов на мероприятие, и я хочу знать разные комбинации (порядок участников не имеет значения). Например,Создайте все комбинации предметов со многими предметами

items <- rep(list(1:3), 5) 
combinations <- expand.grid(items) 
head(combinations) 
    Var1 Var2 Var3 Var4 Var5 
1 1 1 1 1 1 
2 2 1 1 1 1 
3 3 1 1 1 1 
4 1 2 1 1 1 
5 2 2 1 1 1 
6 3 2 1 1 1 

дает мне желаемый формат данных комбинаций для 5 участников.

Теперь, представьте, у меня есть 50 участников. Тогда:

items <- rep(list(1:3), 50) 
combinations <- expand.grid(items) 
Error in rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) : 
    invalid 'times' value 
In addition: Warning message: 
In rep.int(rep.int(seq_len(nx), rep.int(rep.fac, nx)), orep) : 
    NAs introduced by coercion to integer range 

Проблема описана here и возникает из-за ограничений на размер векторов в R. Таким образом, кажется, expand.grid может быть и речи.

Есть ли альтернативы для получения желаемого результата в R? Насколько мне известно, длинные векторы поддерживаются в R с версии 3.0, поэтому я немного удивлен, увидев, что они еще не реализованы. Любые указатели на альтернативы высоко ценятся!

+1

Один из подходов, который вы можете рассмотреть, заключается в том, чтобы избежать создания всех комбинаций одновременно и только тогда, когда они необходимы. См. [Здесь] (http://stackoverflow.com/questions/36143323/pythons-xrange-alternative-for-r-or-how-to-loop-over-large-dataset-lazilly) QA на этом –

ответ

1

С 50 участниками вы создаете DataFrame с 3^50 = 7.17898e + 23 рядами. Это невозможно сохранить в памяти. Поэтому я думаю, что это проблема масштабирования.

Смежные вопросы