如何用尺寸不匹配的向量填充R矩阵?缺失位置保留0
问题描述
创建了一个初始值全为0的矩阵:
nu.sh <- matrix(0, 2, 3) rownames(nu.sh) <- c("Vert 000", "Vert 001") colnames(nu.sh) <- c("Horiz 000", "Horiz 001", "Horiz 002")
矩阵样式:
Horiz 000 Horiz 001 Horiz 002 Vert 000 0 0 0 Vert 001 0 0 0
同时有一个命名向量:
Numb <- c( "Vert 000, Horiz 000" = 5, "Vert 000, Horiz 001" = 5, "Vert 001, Horiz 000" = 3, "Vert 001, Horiz 001" = 4, "Vert 001, Horiz 002" = 5 )
向量中缺少Vert 000, Horiz 002对应的值,需要用该向量填充矩阵,缺失位置保留0,且方法要适配不同尺寸的矩阵和任意缺失情况。
解决方案
通过匹配矩阵行名+列名的组合与向量名称,即可自动完成填充,缺失位置保留0,代码如下:
# 生成矩阵每个位置的命名(格式与Numb向量名称一致) matrix_names <- outer(rownames(nu.sh), colnames(nu.sh), paste, sep = ", ") # 从Numb向量提取对应值,无匹配项则保留0 nu.sh[] <- ifelse(matrix_names %in% names(Numb), Numb[matrix_names], 0)
运行后得到的矩阵:
Horiz 000 Horiz 001 Horiz 002 Vert 000 5 5 0 Vert 001 3 4 5
代码说明
outer(rownames(nu.sh), colnames(nu.sh), paste, sep = ", "):生成与矩阵维度一致的字符矩阵,每个元素是行名+列名的组合,和Numb的命名格式完全匹配。nu.sh[] <- ...:替换矩阵所有元素,不改变矩阵的维度和行列名。ifelse(matrix_names %in% names(Numb), Numb[matrix_names], 0):判断每个位置的命名是否存在于Numb的名称中,存在则取对应值,否则用0填充。
该方法适配任意尺寸的矩阵,无论缺失多少个位置都能自动处理,无需手动指定缺失项。
内容的提问来源于stack exchange,提问作者Shahriar Rashvand
相关产品推荐
相关产品推荐

