【问题标题】:Applying a function to every combination of elements in a vector将函数应用于向量中的每个元素组合
【发布时间】:2013-10-13 20:15:33
【问题描述】:

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

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

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

任何帮助将不胜感激!

谢谢

迈克

【问题讨论】:

  • 您跳过了 AA、BB 和 CC(其中一个 A 来自 M2,另一个来自 M1)——这是故意的吗?

标签: r function apply


【解决方案1】:

结果与您要求的格式不完全一致,但您可以使用 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 是的,只需在outer 之前或内部定义它:m &lt;- outer(y,x, FUN=function(x1,y1) {x1+y1})
【解决方案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-08-28
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    相关资源
    最近更新 更多