我想将某个(自定义)函数应用于数组的所有组合。我认为最好用一个例子来解释:
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中每列的第二个字母表示)
如果有任何不清楚的地方,请告诉我,我觉得我可能没有完美解释。
非常感谢任何帮助!
由于
麦克
答案 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