data.frame 和向量的组合
Combination of data.frame and vector
我的问题类似于this one:我需要创建data.frame
和vector
之间的所有组合,但我需要一个多列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
合并,再次按照我的规则对其进行子集化,但我不知道如何合并a
和 x
您可以 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
过滤器和并行处理可能性。
我的问题类似于this one:我需要创建data.frame
和vector
之间的所有组合,但我需要一个多列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
合并,再次按照我的规则对其进行子集化,但我不知道如何合并a
和 x
您可以 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
过滤器和并行处理可能性。