R语言:数据框元素插入矩阵出错,预期53007却得到344求助
解决R语言循环填充矩阵时数值不符的问题
你好!作为R语言新手遇到这种摸不着头脑的问题确实闹心,我来帮你一步步拆解清楚~
你提到通过循环给矩阵填充值,预期OpData[14,1]的53007会出现在矩阵第一列,但实际得到的是344,甚至找不到这个数值的来源。先来看你的代码和核心问题:
你的代码
OpData <- read.csv2(file="OPData.csv",head=FALSE, sep=",") x <- 1 Matx <- matrix(NA, nrow = 5, ncol = 2) while (x<6) { Matx[x,1] <- OpData[14,1] Matx[x,2] <- x x <- x + 1 Matx } Matx OpData[14,1]
核心问题排查
- 344的来源其实很明确:这个值就是当前
OpData[14,1]存储的内容!你最后运行OpData[14,1]的输出应该就是344,而非你预期的53007——这说明数据读取环节出了问题,和循环逻辑无关。 - 循环的小瑕疵(不影响数值错误):循环里单独写一行
Matx没有实际作用,它不会输出中间结果,但这不是导致数值不对的原因。
为什么读取的数据不对?
你用了read.csv2却强制指定sep=",",这是关键错误:
read.csv2的默认分隔符是分号;,默认小数点符号是逗号,;而read.csv的默认分隔符是逗号,,小数点是.。- 如果你的CSV文件实际是分号分隔,用
sep=","会导致整行内容被错误解析成单个单元格,或者列完全错位,最终第14行第1列的内容根本不是你想要的数值;如果文件是逗号分隔,用read.csv2会把小数点符号搞混,同样导致数值解析错误。
修复方案
- 选对数据读取函数:
- 如果你的CSV是逗号分隔,用
read.csv:OpData <- read.csv(file="OPData.csv", head=FALSE) - 如果是分号分隔,用默认的
read.csv2(不要加sep=","):OpData <- read.csv2(file="OPData.csv", head=FALSE)
- 如果你的CSV是逗号分隔,用
- 先验证数据读取是否正确:运行
OpData[14,1],确认输出是你预期的53007后,再处理矩阵。 - 更简洁的矩阵填充方式(替代循环):
R里没必要用while循环做这种重复填充,一行代码就能搞定:
用Matx <- cbind(rep(OpData[14,1], 5), 1:5)rep()把目标值重复5次,再和1-5的序列绑定成矩阵,高效又不容易出错。
验证步骤
- 先修正读取代码,运行
OpData[14,1]确认数值是53007; - 再运行矩阵填充代码,不管是循环还是简洁写法,都会得到你想要的结果。
内容的提问来源于stack exchange,提问作者Adeyemi Orogbemi
相关产品推荐
相关产品推荐

