如何将5×5矩阵正确转换为含from、to、weight列的数据框?
矩阵转三列数据框的正确实现
你的代码出错的核心原因是R中矩阵默认按列优先展开为向量,但你手动生成的from_id、to_id是按行遍历的逻辑,导致from/to与weight的对应关系完全错位。以下是两种可靠的解决方法:
方法一:用which直接提取非零元素(高效推荐)
利用which函数的arr.ind=TRUE参数,直接获取所有非零元素的行(对应from)和列(对应to)索引,再提取对应权重:
# 获取非零元素的行、列索引 non_zero_idx <- which(mat != 0, arr.ind = TRUE) # 构建目标数据框 edges_df <- data.frame( from = non_zero_idx[, "row"], to = non_zero_idx[, "col"], weight = mat[non_zero_idx] )
方法二:基于行优先展开的基础R实现
先生成所有from/to的组合,再通过转置矩阵实现行优先展开,保证权重与索引对应:
# 生成所有from和to的组合(行优先) full_grid <- expand.grid(from = 1:5, to = 1:5) # 转置矩阵后按行展开为向量,保证权重与from/to对应 full_grid$weight <- as.vector(t(mat)) # 过滤权重为0的行 edges_df <- full_grid[full_grid$weight != 0, ]
验证结果:以原矩阵第5行(from=5)为例,会得到to=3(权重0.1666667)和to=5(权重1)两条记录,这与原矩阵的实际非零值一致。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

