使用read.table读取txt文件报错:期望39列但实际仅20列
解决read.table读取FAMAFrench.txt报错的问题
报错原因
表头中的列名包含空格(比如<= 0、Lo 30),read.table默认将所有空格视为分隔符,导致表头被错误拆分出39个元素,而数据行实际只有20列,行列数不匹配引发报错。
解决方案
方法1:指定正确的分隔规则
如果文件是多个连续空格分隔,开启strip.white=TRUE合并连续空格为单个分隔符,避免列名被拆分:
FAMA <- read.table("FAMAFrench.txt", header = TRUE, sep = " ", strip.white = TRUE)
如果文件实际是制表符分隔(示例里的对齐更像制表符),直接指定制表符分隔:
FAMA <- read.table("FAMAFrench.txt", header = TRUE, sep = "\t")
方法2:手动指定列名
先跳过表头读取数据,再手动设置列名,彻底避免表头拆分问题:
# 读取数据行,跳过第一行表头 data <- read.table("FAMAFrench.txt", header = FALSE, skip = 1, sep = " ", strip.white = TRUE) # 手动设置20列的列名 colnames(data) <- c("month", "<= 0", "Lo 30", "Med 40", "Hi 30", "Lo 20", "Qnt 2", "Qnt 3", "Qnt 4", "Hi 20", "Lo 10", "Dec 2", "Dec 3", "Dec 4", "Dec 5", "Dec 6", "Dec 7", "Dec 8", "Dec 9", "Hi 10") FAMA <- data
方法3:读取固定宽度格式(推荐)
从示例看数据是固定宽度对齐的,用readr包的read_fwf更稳定:
# 未安装readr则先执行:install.packages("readr") library(readr) # 根据示例定义每列宽度 widths <- c(6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8) FAMA <- read_fwf("FAMAFrench.txt", fwf_widths(widths), col_names = TRUE)
验证读取结果
读取后用以下代码确认行列数是否符合预期:
dim(FAMA) # 预期输出:[1] 1166 20
内容的提问来源于stack exchange,提问作者RStudent
相关产品推荐
相关产品推荐

