2013-04-21 45 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

相關問題