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

7
我想对一个数组的所有组合应用某个(自定义)函数。最好通过一个例子来解释:
矩阵1:
A B C
1 2 3

翻译:矩阵2:
A B C  
4 5 6

我想要做以下事情:获取矩阵二的所有组合,并对每个应用以下函数:
矩阵三:
AB  AC  BC  CB  CA  BA  
4/2 4/3 5/3 6/2 6/1 5/1  

翻译如下:

将函数应用于矩阵3的位置,对应于矩阵2中的元素(由矩阵3每列的第一个字母表示)/ 对应于矩阵2中的元素(由矩阵3每列的第二个字母表示)。

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

非常感谢您的帮助!

谢谢

Mike


你跳过了AA、BB和CC(其中一个A来自M2,另一个来自M1)-- 这是故意的吗? - ricardo
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 

@juba 太好了,完美地解决了问题,非常感谢!另外一个快速的问题:如果我想应用的函数不是通用函数(即不是简单的算术函数),有没有办法做到这一点?再次感谢。 - Mike
@Mike 是的,只需要在 outer 函数之前或内部定义它:m <- outer(y,x, FUN=function(x1,y1) {x1+y1}) - juba

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接