2015-08-05 2 views
2

Мой вопрос похож на this one: Мне нужно создать все комбинации между data.frame и vector, но мне нужно решение для многоколоновых data.frames, поэтому я могу сократить время вычислений для более крупных проблем ,Комбинация data.frame и vector

Пример того, что я ищу:

Мне нужно создать комбинацию 1:3 с собой три раза, но, в конце концов, мне просто нужно комбинации, что общая sum составляет менее 5.

Один из способов сделать это - просто использовать expand.grid и в итоге получить 27 комбинаций, а затем всего 4 комбинации, которые подчиняются моему правилу суммы.

> x = 1:3 
> b = expand.grid(x,x,x) 

> rows = apply(b,1,sum) 
> sum(rows < 5) 
[1] 4 

# Which rows obey the rule 
> b[rows<5,] 
    Var1 Var2 Var3 
1  1 1 1 
2  2 1 1 
4  1 2 1 
10 1 1 2 

Это работает просто отлично, но для больших векторов или нескольких комбинаций, а не только 3, она занимает много обработки. Я понял, что еще один способ сделать это было бы разделив задачу и применения фильтра на каждом шаге:

> x = 1:3 
> a = expand.grid(x,x) 
> rows = apply(a,1,sum) 
> sum(rows < 5) 
[1] 6 

# Which rows obey the rule 
> a[rows<5,] 
    Var1 Var2 
1 1 1 
2 2 1 
3 3 1 
4 1 2 
5 2 2 
7 1 3 

А затем взять эти 6 рядов из a и объединить их с x, и еще раз подмножество его в соответствии с моим править, но я не знаю, как совместить a и x

ответ

1

Вы можете expand.grid по номерам строк и cbind вместе

expand.grid.XY <- function(X,Y) { 
    X<-as.data.frame(X); 
    Y<-as.data.frame(Y); 
    idx<-expand.grid(1:nrow(X),1:nrow(Y)); 
    cbind(X[idx[,1],,drop=FALSE],Y[idx[,2],,drop=FALSE]) 
} 

С вашим примером,

expand.grid.XY(a[rows<5,],x) 
 
    Var1 Var2 Y 
1  1 1 1 
2  2 1 1 
3  3 1 1 
4  1 2 1 
5  2 2 1 
7  1 3 1 
1.1 1 1 2 
2.1 2 1 2 
3.1 3 1 2 
4.1 1 2 2 
5.1 2 2 2 
7.1 1 3 2 
1.2 1 1 3 
2.2 2 1 3 
3.2 3 1 3 
4.2 1 2 3 
5.2 2 2 3 
7.2 1 3 3 

В зависимости от характера вашей проблемы, тем не менее, вы можете посмотреть в foreach пакет, который включает в себя when фильтра и параллельные возможности обработки.

+0

Спасибо! Очень умна идея использования номеров строк data.frame. Я посмотрю 'foreach'. Моя реальная проблема в основном такая же, как описано выше, разница в размере векторов и сколько раз мне нужно объединить ее. Я запускаю симуляцию, которая требует набора параметров, которые, суммированные, не могут превышать определенный порог. – Bernardo

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