2013-10-07 85 views
4

我想將某個(自定義)函數應用於數組的所有組合。我認爲最好用一個例子來解釋:將函數應用於向量中的每個元素組合

矩陣1:

A B C 
1 2 3 

黑客帝國2:

A B C 
4 5 6 

我想做到以下幾點:矩陣兩個獲得所有組合應用一個函數到每個如下:

矩陣3:

AB AC BC CB CA BA 
4/2 4/3 5/3 6/2 6/1 5/1 

如果應用於矩陣3的函數是矩陣2(由矩陣3的每列中的第一個字母表示)/矩陣2的相應元素(由矩陣3中每列中的第二個字母表示)的對應元素, 。

請讓我知道,如果有什麼不清楚,我覺得我可能沒有完全解釋。

任何幫助將不勝感激!

感謝

邁克

+0

您跳過AA,BB和CC(其中一個A是從M2和M1從其他) - 這是故意的? – ricardo

回答

8

結果是不完全在你請求的格式,但可以使用outer從你的兩個輸入向量創建成果的矩陣:

x <- c(A=1,B=2,C=3) 
y <- c(A=4,B=5,C=6) 
outer(x,y, FUN="/") 

將給:

 A B   C 
A 0.25 0.2 0.1666667 
B 0.50 0.4 0.3333333 
C 0.75 0.6 0.5000000 

如果你真的想要一個向量作爲結果,你可以使用:

m <- outer(x,y, FUN="/") 
v <- as.vector(m) 
names(v) <- as.vector(outer(names(x),names(y),FUN="paste0")) 

,然後得到:

 AA  BA  CA  AB  BB  CB  AC 
0.2500000 0.5000000 0.7500000 0.2000000 0.4000000 0.6000000 0.1666667 
     BC  CC 
0.3333333 0.5000000 
+1

+1,很好的解決方案。我認爲比率是錯誤的:在問題中,所有比率都大於1。 – ricardo

+0

@ricardo,是的,你說得對,謝謝你指出!它應該是'outer(y,x,FUN =「/」)'。 – juba

+0

@juba偉大的,完美的工作,非常感謝!另一個簡單的問題是:如果我想申請的函數不是泛型函數(即不是簡單的算術函數),有沒有辦法做到這一點?再次感謝 – Mike

2

這可以簡單地做,如果你安裝gtools並使用permutations功能。

require(gtools) 
M1 <- list(A=1, B=2, C=3) 
M2 <- list(A=4, B=5, C=6) 

perms <- t(permutations(3, 2, 1:3)) 

comboList <- list() 
for (i in 1:ncol(perms)) { 
    nameString <- paste0(names(M2)[perms[1,i]], names(M1)[perms[2,i]]) 
    comboList[[i]] <- mapply("/", M2[[perms[,i][1]]], M1[[perms[,i][2]]]) 
} 

mapply功能是一個非常神奇的內置R功能。知道*apply函數的整個系列是值得的。

輸出是comboList,這是如下:

> comboList 
$AB 
[1] 2 

$AC 
[1] 1.333333 

$BA 
[1] 5 

$BC 
[1] 1.666667 

$CA 
[1] 6 

$CB 
[1] 3 
相關問題