2

这是我的数据框:

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  

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

4

2 回答 2

6

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

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

这会产生一个lists 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
于 2013-04-21T15:48:58.877 回答
1

您快到了,只需将每一列用作数据框的索引。

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

## first
df[idx[,1]]

## 19th
df[idx[,19]]
于 2013-04-21T16:05:03.450 回答