data.frame和vector的组合

时间:2015-08-05 15:54:36

标签: r vector dataframe combinations

我的问题类似于this one:我需要在var rangeSlider = document.getElementById('weight'); noUiSlider.create(rangeSlider, { start: [ 0 ], range: { 'min': [ 1 ], 'max': [ 10 ] } }); rangeSlider.noUiSlider.on('slide', function(values, handle){ var v = values[handle], s = v * 10, l = 50; $(rangeSlider).find('.noUi-handle').css({"background-color":"hsl(10," + s + "%," + l +"%)"}) }); data.frame之间创建所有组合,但我需要一个多列数据框架的解决方案,所以我可以减少更大问题的计算时间。

我正在寻找的例子:

我需要创建vector与自身的组合三次,但最后,我只需要总1:3小于5的组合。

这样做的一种方法是简单地使用sum并最终使用27种组合,然后只有4种符合我的和规则的组合。

expand.grid

效果很好,但对于较大的矢量或多个组合,而不是仅仅3,需要大量处理。我认为另一种方法是分割任务并在每个步骤中应用过滤器:

> 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

然后从> 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合并,然后根据我的规则再次对其进行分组,但我不知道如何合并xa

1 个答案:

答案 0 :(得分:1)

您可以在行号上expand.gridcbind在一起

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过滤器和并行处理功能。