2013-04-21 20 views
2

这里是我的数据帧:如何使用combn和数据框的结果来获得新的martix?

V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
2 1 1 1 1 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 
3 1 1 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 
4 1 1 1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 
5 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 
6 1 -1 -1 1 1 -1 -1 -1 -1 1 1 -1 -1 1 1 
7 1 -1 -1 -1 -1 1 1 1 1 -1 -1 -1 -1 1 1 
8 1 -1 -1 -1 -1 1 1 -1 -1 1 1 1 1 -1 -1 
9 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 
10 -1 1 -1 1 -1 1 -1 -1 1 -1 1 -1 1 -1 1 
11 -1 1 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1 
12 -1 1 -1 -1 1 -1 1 -1 1 -1 1 1 -1 1 -1 
13 -1 -1 1 1 -1 -1 1 1 -1 -1 1 1 -1 -1 1 
14 -1 -1 1 1 -1 -1 1 -1 1 1 -1 -1 1 1 -1 
15 -1 -1 1 -1 1 1 -1 1 -1 -1 1 -1 1 1 -1 
16 -1 -1 1 -1 1 1 -1 -1 1 1 -1 1 -1 -1 1 

首先,我用combn(4:15, 3)计算组合。

像这样:

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] ....  [,220] 
[1,] 4 4 4 4 4 4 4 4 4  4  4  4  4 ....   13 
[2,] 5 5 5 5 5 5 5 5 5  5  6  6  6 ....   14 
[3,] 6 7 8 9 10 11 12 13 14 15  7  8  9 ....   15 

我的问题是:如何使用的combn(4:15, 3)和我的数据集得到了很多矩阵的结果呢? (在这种情况下,我需要220个矩阵,因为有220个组合)

在第一个组合,例如, 拳头组合是:

 [,1] 
[1,] 4  
[2,] 5  
[3,] 6  

所以我走第4栏第5栏和列6从我的数据帧得到这样一个新的矩阵:

V4 V5 V6 
1 1 1 1 
2 1 1 1 
3 1 -1 -1 
4 1 -1 -1 
5 -1 1 1 
6 -1 1 1 
7 -1 -1 -1 
8 -1 -1 -1 
9 -1 1 -1 
10 -1 1 -1 
11 -1 -1 1 
12 -1 -1 1 
13 1 1 -1 
14 1 1 -1 
15 1 -1 1 
16 1 -1 1 

没有人有一些简单的代码片段做到这一点?感谢大家的帮助!

+2

只是为了澄清,你想获取所有的220'data.frame'子集并存储在一个变量(如Ananda的解决方案)吗?或者你不知道如何索引,你需要*不*要同时加载所有'data.frame'子集? – Arun 2013-04-21 17:36:16

+1

@Arun +1,了解这一点很重要。 – Nishanth 2013-04-22 02:34:39

+0

@Arun 我不确定哪种方法更适合我想要在下一步中实现的目标。 在下一步中,我想为220个子集中的每一个添加一个固定列,以创建一组新的子集(集合A)。然后我想要使用combn(4,2)的模式乘以每个子集(集合A)中的列,然后combn(4,3),然后combn(4,4)。然后用结果创建另一组子集(集合B),包括原始的4列。 – Stacy 2013-04-22 10:06:37

回答

6

combn有一个函数的参数,所以你可以简单地做:

output <- combn(4:15, 3, FUN = function(x) mydf[x], simplify = FALSE) 

这产生data.framelist A S。这是第一个:

output[[1]] 
# V4 V5 V6 
# 1 1 1 1 
# 2 1 1 1 
# 3 -1 -1 -1 
# 4 -1 -1 -1 
# 5 1 1 -1 
# 6 1 1 -1 
# 7 -1 -1 1 
# 8 -1 -1 1 
# 9 1 -1 1 
# 10 1 -1 1 
# 11 -1 1 -1 
# 12 -1 1 -1 
# 13 1 -1 -1 
# 14 1 -1 -1 
# 15 -1 1 1 
# 16 -1 1 1 

和第220:

output[[220]] 
# V13 V14 V15 
# 1 1 1 1 
# 2 -1 -1 -1 
# 3 -1 -1 -1 
# 4 1 1 1 
# 5 1 -1 -1 
# 6 -1 1 1 
# 7 -1 1 1 
# 8 1 -1 -1 
# 9 -1 1 -1 
# 10 1 -1 1 
# 11 1 -1 1 
# 12 -1 1 -1 
# 13 -1 -1 1 
# 14 1 1 -1 
# 15 1 1 -1 
# 16 -1 -1 1 

为了便于比较,这里本身就是combn

> temp <- combn(4:15, 3) 
> ncol(temp) 
[1] 220 
> temp[, 1] 
[1] 4 5 6 
> temp[, 220] 
[1] 13 14 15 
1

你是几乎没有,只是用作为每列数据帧的索引。

df <- your.data.frame 
idx <- combn(4:15, 3) 

## first 
df[idx[,1]] 

## 19th 
df[idx[,19]] 
+0

我不认为这是推荐的方式。 – Arun 2013-04-21 16:18:08

+0

我很好奇知道原因,我会相应地修改/删除。 – Nishanth 2013-04-21 16:19:34

+0

循环不是很明显。我假设:输入19次'df [idx [,。]]'?如果是这样,这是丑陋的和不必要的。但我不推荐一个循环。 Ananda的解决方案几乎涵盖了可能的最佳解决方案。在这种情况下,我不能想到另一个“等效”解决方案。 – Arun 2013-04-21 16:22:37

相关问题