【发布时间】:2012-01-19 17:06:10
【问题描述】:
我想尽快将矩阵某些行中的第一个零替换为存储在另一个向量中的值。
有一个数字矩阵,其中每一行都是一个带有一些零的向量。
我还有两个向量,一个包含要替换的行,另一个包含新值:replace.in.these.rows 和 new.values。另外,我可以用 sapply 生成第一个零的向量
mat <- matrix(1,5,5)
mat[c(1,8,10,14,16,22,14)] <- 0
replace.in.these.rows <- c(1,2,3)
new.values <- c(91,92,93)
corresponding.poz.of.1st.zero <- sapply(replace.in.these.rows,
function(x) which(mat [x,] == 0)[1] )
现在我想要一些迭代索引向量的东西,但可能没有 for 循环:
matrix[replace.in.these.rows, corresponding.poz.of.the.1st.zero ] <- new.values
索引不仅仅是简单的向量,还有什么技巧吗?它不能使用列表或数组(例如逐列)作为索引。
默认情况下,R 矩阵是一组列向量。如果我以转置的形式存储数据,我会得到什么吗?这意味着在列而不是行上工作。
上下文:
此矩阵存储网络的联系人 ID。这不是邻接矩阵 n x n,而是 n x max.number.of.partners(或 n*=30)矩阵。
网络默认使用edgelist,但我想将“来自X的所有链接”存储在一起。
我假设,但不确定这是否比总是从边缘列表中提取信息更有效(在模拟中每轮多次)
我还假设这种线性增长的矩阵形式比将相同的信息存储在相同的格式化列表中要快。
也欢迎一些关于这些上下文假设的 cmets。
【问题讨论】:
-
matrix[replace.in.these.rows + nrow(matrix)*(corresponding.poz.of.the.1st.zero-1)] <- new.values