7

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

矩阵 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 的每列中的第二个字母表示)。

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

任何帮助将不胜感激!

谢谢

麦克风

4

2 回答 2

11

结果与您要求的格式不完全一致,但您可以使用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 
于 2013-10-07T10:08:36.970 回答
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
于 2013-10-07T10:30:24.467 回答