R语言按矩阵行列索引取值为数据框新增列异常求解
问题原因
R里给矩阵传两个向量做行、列双索引时,默认会取两个向量的笛卡尔积返回子矩阵,不会按行逐对匹配位置。比如行索引长度是n,列索引长度是m,返回的就是n*m的矩阵,这就是运行代码后生成多列的根本原因。
解决方案
把存行号的Col1和存列号的Col2用cbind()拼成两列的索引矩阵,再传给矩阵做索引即可。R遇到矩阵形式的索引,会自动逐行配对行、列位置,返回长度和数据框行数一致的向量,直接赋值就能得到单列新列。
正确实现代码:
Df$NewCol <- GroMatrix[cbind(Df$Col1, Df$Col2)]
效果验证
你创建的GroMatrix矩阵实际内容如下:
[,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 2 3 4 5 6 [3,] 3 4 5 6 7 [4,] 4 5 6 7 8
用测试数据框验证逻辑:
# 构造测试数据 Df <- data.frame( Col1 = c(1,2,3,4), Col2 = c(5,4,3,2) ) # 执行取值赋值 Df$NewCol <- GroMatrix[cbind(Df$Col1, Df$Col2)]
运行后NewCol为单列,取值依次为5、5、5、5,完全符合按行匹配行列号取数的预期。
内容的提问来源于stack exchange,提问作者Saptarshi Roy
相关产品推荐
相关产品推荐

