【问题标题】:R: function on all column combinations from two data frames using nested applyR:使用嵌套应用对来自两个数据帧的所有列组合的函数
【发布时间】:2017-01-20 08:49:30
【问题描述】:

给定两个列数相同的矩阵。

m1 <- matrix(1:12, ncol=3)
m2 <- matrix(10:2, ncol=3)

假设我有一个函数,它接受两个向量并执行类似于每个向量 min 的乘积(玩具示例):

fun <- function(v1, v2)(min(v1)*min(v2))

我无法理解如何通过使用两个嵌套的应用调用对所有列组合执行该函数。 在 m1 与第一列上使用 apply 就像:

apply(m1, 2, fun, m2[,1])

我坚持循环遍历所有 m2 的列,例如:

m3<-matrix(NA, ncol=3, nrow=3)
for(c in 1:ncol(m2)){ 
m3[,c] <- apply(m1, 2, fun, m2[,c])
}

这给了

> m3
     [,1] [,2] [,3]
[1,]   10    9    8
[2,]   50   45   40
[3,]   90   81   72

那么如何将此循环框定为应用?

编辑:代码有错误 - 抱歉。见编辑

【问题讨论】:

    标签: r matrix nested apply


    【解决方案1】:

    如果你有兴趣使用嵌套apply,我们可以试试

    apply(m1, 2, function(x) apply(m2, 2, function(y) min(x) * min(y)))
    
    #     [,1] [,2] [,3]
    #[1,]    8   40   72
    #[2,]    5   25   45
    #[3,]    2   10   18
    

    因为你已经定义了函数,

    apply(m1, 2, function(x) apply(m2, 2, fun, x))
    

    会更简单。

    【讨论】:

    • 啊,正是我所追求的!
    【解决方案2】:

    我会在这里使用mapply,并稍微更改函数,使其传递索引而不是实际的列:

    m1 <- matrix(1:12, ncol=3)
    m2 <- matrix(10:2, ncol=3)
    
    fun <- function(i1, i2) (min(m1[,i1])*min(m2[,i2]))
    
    res <- matrix(mapply(fun, rep(1:3, times=3), rep(1:3, each=3)), ncol=3)
    

    这是你想要的吗?

    【讨论】:

    • 我猜是这样 - 但我真的很想了解如何进行嵌套应用 - 毕竟 apply 是一个循环,所以在我的示例中交换循环应该是直截了当的。
    【解决方案3】:

    我们可以使用outercolMins(来自matrixStats)等矢量化函数更轻松地做到这一点

    library(matrixStats)
    outer(colMins(m1), colMins(m2))
    #    [,1] [,2] [,3]
    #[1,]    8    5    2
    #[2,]   40   25   10
    #[3,]   72   45   18
    

    【讨论】:

    • 真实且非常紧凑(以玩具为例)。我真的在追求更一般的东西。但也许 on 可以与其他原因函数向量化。
    • @user3375672 没问题,我在回答时正在查看您的示例
    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2016-08-07
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    相关资源
    最近更新 更多