这是我的数据框:
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
有没有人有一些简单的代码来执行此操作?谢谢大家的帮助!
答案 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]]