2016-09-14 179 views
1

我有一個矩陣(說)x存在/缺乏某些屬性爲33個不同的屬性爲1.000響應者。數據看起來像這樣:在所有可能的組合對中組合多個列

| P1| P2| P3| P4| P5| P6| P7| P8| P9| P10| P11| P12| P13| P14| P15| P16| P17| P18| P19| P19| P20| P21| P22| P23| P24| P25| P26| P26| P27|P28| P29| P30| P31| P32| P33 
| 0| 0| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 1| 0| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 0| 1| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 0| 0| 0| 1| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 0| 1| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 0| 0| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 1| 0| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 0| 1| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 0| 0| 0| 0| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 
| 0| 0| 0| 1| 0| 1| 0| 0| 1| 0| 0| 0| 1| 0| 1| 1| 1| 1| 1| 0| 0| 0| 0| 0| 1| 1| 0| 0| 0| 0| 0| 0| 0| 1| 0 

我想創建的數據幀,其中33列的所有可能的組合是可能的,其具有用於每個1000名受訪者1,如果在原始矩陣x兩列有10,否則。

例如,我想獲得組合與此代碼的原始矩陣的第一列和第二列:

ifelse(x[,i] == 1 & x[,i+1] == 1, 1, 0) 

我應的1,000行的數據幀結束(受訪者號碼等)和528個變量,因爲這是矩陣x中33列的不同對組合的數目。

在R中有沒有一種有效的方法來實現這一點?

+0

是否順序在合成矩陣物質中的元素?例如'1 1 0 0' vs'0 1 0 1'? – 989

回答

1

我們可以使用combn獲得列名的兩兩組合,子集列,檢查兩列的元素是否等於1,轉換爲數值,並cbind

res <- do.call(cbind, combn(colnames(df1), 2, 
      FUN = function(x) list(+(df1[x[1]] & df1[x[2]])))) 
dim(res) 
#[1] 10 528 
+0

當我使用代碼時,我創建了一個有528列的矩陣,但只有一行NAs。 (假設我有這個矩陣(只有10個觀察值): n < - 樣本(c(0,1),替換=真,大小= 330) x < - 矩陣(n,n行= 10,ncol = 33) P < - 代表( 「P」,33) Q < - 1時33個 名< - paste0(P,Q) colnames(X)< - 名 我應該如何申請您的解決方案? – Crimc

+0

@Crimc 1行NAs不清楚。也許你在列中有一些NA值? – akrun

+0

@Crimc除了將'df1'更改爲'x'以及使用','分隔矩陣的行/列索引即'res < - do.call(cbind,combn(colnames(x), 2, FUN = function(y)list(+(x [,y [1]]&x [,y [2]])))); dim(res) #[1] 10 528' – akrun