I would like to apply a certain (custom) function to all combinations of an array. I think its best to explain with an example:
Matrix 1 :
A B C
1 2 3
Matrix 2 :
A B C
4 5 6
I would like to do the following: obtain all the combinations of Matrix two and apply a function to each as follows:
Matrix 3 :
AB AC BC CB CA BA
4/2 4/3 5/3 6/2 6/1 5/1
Where the function applied to Matrix 3 is the corresponding element of Matrix 2 (represented by the first letter in each column of Matrix 3)/the corresponding element of Matrix 2 (represented by the second letter in each column in Matrix 3).
Please let me know if anything is unclear, I feel that I may not have explained perfectly.
Any help would be greatly appreciated!
Thanks
Mike
The result is not exactly in the format you asked for, but you can use outer
to create a matrix of results from your two input vectors :
x <- c(A=1,B=2,C=3)
y <- c(A=4,B=5,C=6)
outer(x,y, FUN="/")
Will give :
A B C
A 0.25 0.2 0.1666667
B 0.50 0.4 0.3333333
C 0.75 0.6 0.5000000
If you really want a vector as result, you can use :
m <- outer(x,y, FUN="/")
v <- as.vector(m)
names(v) <- as.vector(outer(names(x),names(y),FUN="paste0"))
And then get :
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
This can be done simply if you install gtools
and use the permutations
function.
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]]])
}
The mapply
function is a pretty magical built in R
function. It's worth while getting the know the entire family of *apply
functions.
The output is in comboList
, which is as follows:
> comboList
$AB
[1] 2
$AC
[1] 1.333333
$BA
[1] 5
$BC
[1] 1.666667
$CA
[1] 6
$CB
[1] 3