将函数应用于向量中的每个元素组合

时间:2013-10-07 09:55:35

标签: r function apply

我想将某个(自定义)函数应用于数组的所有组合。我认为最好用一个例子来解释:

Matrix 1:

A B C
1 2 3

Matrix 2:

A B C  
4 5 6

我想执行以下操作:获取Matrix 2的所有组合,并按如下方式对每个组合应用一个函数:

Matrix 3:

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

应用于Matrix 3的函数是Matrix 2的相应元素(由Matrix 3的每列中的第一个字母表示)/ Matrix 2的相应元素(由Matrix 3中每列的第二个字母表示)

如果有任何不清楚的地方,请告诉我,我觉得我可能没有完美解释。

非常感谢任何帮助!

由于

麦克

2 个答案:

答案 0 :(得分:10)

结果并不完全符合您要求的格式,但您可以使用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 :(得分: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