【问题标题】:How to apply a function on every possible combination of two columns in two matrices in R如何对R中两个矩阵中两列的每种可能组合应用函数
【发布时间】:2017-07-09 02:17:10
【问题描述】:

我有两个矩阵,每个矩阵有 300 列; M1M2 我正在对它们应用一个简单的 ifelse 函数,如下所示:

result<-ifelse(M1[-nrow(M1),]<M2[-nrow(M2),],1,4)


tail(result)


                    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17
2017-06-26 04:00:00  4  1  1  4  4  4  4  4  4   4   4   4   4   4   4   4   4
2017-06-26 05:00:00  4  1  1  1  4  4  4  4  4   4   4   4   4   4   4   4   4
2017-06-26 06:00:00  4  1  1  1  4  4  4  4  4   4   4   4   4   4   4   4   4
2017-06-26 07:00:00  4  1  1  1  4  4  4  4  4   4   4   4   4   4   4   4   4
2017-06-26 08:00:00  4  1  1  1  1  4  4  4  4   4   4   4   4   4   4   4   4
2017-06-26 09:00:00  4  1  1  1  1  1  4  4  4   4   4   4   4   4   4   4   4

在这种情况下,ifelse 函数应用于M1 中的每一列以及M2 中的匹配列

如何将ifelse 函数应用于M1M2 中每个可能的列组合,并将结果保存到一个大矩阵(本例中为90000 列)或矩阵列表中?

【问题讨论】:

    标签: r if-statement matrix


    【解决方案1】:

    使用expand.grid 获得列索引的笛卡尔积会有所帮助。

    m1 <- matrix(1:9, ncol=3)
    m2 <- matrix(4:12, ncol=3)
    g <- expand.grid(1:nrow(m1), 1:ncol(m2))
    ans <- ifelse(m1[, g[, 1]] < m2[, g[, 2]], 1, 4)
    

    【讨论】:

    • 感谢您的回答,它很简单并且可以完成工作。小事,我认为在我的情况下应该是g &lt;- expand.grid(1:ncol(m1), 1:ncol(m2)) 而不是1:nrow(m1),因为我有兴趣对列的每个组合而不是列与另一个矩阵的行进行测试。当我将代码应用于整个数据(包括 3700 行)时,我的电脑死机了,我不得不重新启动它。当我只在 10 行上做同样的事情时,它起作用了。有什么建议如何使它适用于整个数据集?
    • @aRo 根据您的描述,我猜您的计算机可能会冻结,因为它在运行命令时内存不足(R 在内存中执行操作)。如果是这样,请尝试以下操作 1) bigmemory 将您的一些数据存储在磁盘上cran.r-project.org/web/packages/bigmemory/index.html 2) 使用 for 循环构建比较每个索引并将其保存到矩阵中,而不是一次性完成 3) 获取更多内存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多