【问题标题】:Fastest way to populate a matrix using row/column indicies stored in vectors使用存储在向量中的行/列索引填充矩阵的最快方法
【发布时间】:2015-11-27 22:02:28
【问题描述】:

我正在尝试做一些看起来相对简单的事情,但我只能使用 for 循环让它工作。

一般的想法是我有两个向量,一个向量对应于矩阵中的一行,另一个向量对应于列,两者的长度相同。我从一个 0 矩阵开始,然后根据两个向量中的值对递增 [row,column]。例如:

vectorCols <- c(1,2,3,1,3)
vectorRows <-  c(2,1,2,3,2)
countMat <- matrix(rep(0,9),ncol=3)

最后,countMat 是:

     [,1] [,2] [,3]
[1,]    0    1    0
[2,]    1    0    2
[3,]    1    0    0

这很容易通过 for 循环进行管理:

for (i in 1:length(vectorCols)){
  countMat[vectorRows[i],vectorCols[i]] <- countMat[vectorRows[i],vectorCols[i]] + 1
}

但我不禁想到在 R 中有更好的方法来做到这一点。我尝试使用 apply 系列函数,但是当你想分配某些东西时,这些函数不能很好地配合。我知道我可以使用mapply 并一次构建countMat 的每个元素一个值,但这似乎效率低下--vectorRowsvectorCols 很长,完全遍历它们似乎很浪费时间对于countMat 中的每个单元格。但除了循环和mapply,我想不出该怎么做。我考虑过将assignapply 系列之一一起使用,但有一个警告——我的矩阵实际上具有列和行的名称,名称存储在vectorColsvectorRows 中,而且看起来assign 不想玩得很好,比如 countMat["rowName"]["columnName"] (not to mention thatapply` 仍然希望为迭代中的每个步骤返回一个值)。

有什么建议吗?如果我没有向量列和行的名称,我也很好奇是否有理想的方法来做到这一点。如果是这种情况,那么也许我可以将 vectorColsvectorRows 转换为数字,然后构建矩阵,然后重命名所有内容。

谢谢大家。

【问题讨论】:

    标签: r apply


    【解决方案1】:

    这里有一些解决方案。不需要任何软件包。

    1) 表格

    table(vectorRows, vectorCols)
    

    给予:

              vectorCols
    vectorRows 1 2 3
             1 0 1 0
             2 1 0 2
             3 1 0 0
    

    请注意,如果有任何行或列没有条目,则不会出现。

    2) 聚合

    ag <- aggregate( Freq ~ ., data.frame(Freq = 1, vectorRows, vectorCols), sum)
    countMat[as.matrix(ag[-3])] <- ag[[3]]
    

    给予:

    > countMat
         [,1] [,2] [,3]
    [1,]    0    1    0
    [2,]    1    0    2
    [3,]    1    0    0
    

    3) xtabs

    xtabs(~ vectorRows + vectorCols)
    

    给予:

              vectorCols
    vectorRows 1 2 3
             1 0 1 0
             2 1 0 2
             3 1 0 0
    

    【讨论】:

    • 谢谢! (如果您看到它们,请忽略我刚刚删除的 cmets :))。这三种方法都有效,表格方法也给了我归零的列......
    猜你喜欢
    • 2018-05-11
    • 2013-05-27
    • 2019-04-26
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多