Applying a function to every combination of elemen

2020-03-03 08:43发布

问题:

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

回答1:

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 


回答2:

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


标签: r function apply