data.frame 和向量的组合

Combination of data.frame and vector

我的问题类似于this one:我需要创建data.framevector之间的所有组合,但我需要一个多列data.frames的解决方案,这样我就可以减少更大问题的计算时间。

我正在寻找的示例:

我需要创建3次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

然后从a中取出这6行并与x合并,再次按照我的规则对其进行子集化,但我不知道如何合并ax

您可以 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 过滤器和并行处理可能性。