2013-10-07 87 views
4

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

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

请让我知道,如果有什么不清楚,我觉得我可能没有完全解释。

任何帮助将不胜感激!

感谢

迈克

+0

您跳过AA,BB和CC(其中一个A是从M2和M1从其他) - 这是故意的? – ricardo

回答

8

结果是不完全在你请求的格式,但可以使用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

+1,很好的解决方案。我认为比率是错误的:在问题中,所有比率都大于1。 – ricardo

+0

@ricardo,是的,你说得对,谢谢你指出!它应该是'outer(y,x,FUN =“/”)'。 – juba

+0

@juba伟大的,完美的工作,非常感谢!另一个简单的问题是:如果我想申请的函数不是泛型函数(即不是简单的算术函数),有没有办法做到这一点?再次感谢 – Mike

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 
相关问题