【发布时间】: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 的每个元素一个值,但这似乎效率低下--vectorRows 和vectorCols 很长,完全遍历它们似乎很浪费时间对于countMat 中的每个单元格。但除了循环和mapply,我想不出该怎么做。我考虑过将assign 与apply 系列之一一起使用,但有一个警告——我的矩阵实际上具有列和行的名称,名称存储在vectorCols 和vectorRows 中,而且看起来assign 不想玩得很好,比如 countMat["rowName"]["columnName"] (not to mention thatapply` 仍然希望为迭代中的每个步骤返回一个值)。
有什么建议吗?如果我没有向量列和行的名称,我也很好奇是否有理想的方法来做到这一点。如果是这种情况,那么也许我可以将 vectorCols 和 vectorRows 转换为数字,然后构建矩阵,然后重命名所有内容。
谢谢大家。
【问题讨论】: