如何使用combn和数据框的结果来获得新的矩阵?

时间:2013-04-21 15:41:51

标签: r

这是我的数据框:

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 个答案:

答案 0 :(得分:6)

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

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

这会生成list data.frame个。这是第一个:

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 :(得分:1)

你几乎就在那里,只需使用每一列作为数据框的索引。

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

## first
df[idx[,1]]

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