vroom解析空格分隔列异常:原11列现生成58列空逻辑列求助
问题与解决方法
问题
一年前用以下vroom代码读取空格分隔的全球气温数据时,能正常生成11列数值型数据:
library(vroom) fname <- "http://berkeleyearth.lbl.gov/auto/Global/Complete_TAVG_complete.txt" dat <- vroom(file = fname, delim = " ", col_names = FALSE, comment = "%", na = "NaN")
但现在运行这段代码,生成的dat包含58列,且大部分是空的逻辑类型。怀疑是空格编码问题?
附当前环境信息:
R version 4.2.2 (2022-10-31) Platform: x86_64-apple-darwin17.0 (64-bit) Running under: macOS Big Sur 11.7.4 Matrix products: default LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] vroom_1.6.1
原因分析
不是空格编码问题,核心原因是:
- vroom设置
delim = " "时,会将单个空格作为分隔符,但数据中存在大量连续空格(或混合了制表符),每一个空格都会被识别为分隔符,从而产生大量空列。 - 也可能是目标数据文件的格式发生了变更,或者vroom版本更新后默认解析逻辑有调整。
解决方案
1. 匹配任意空白字符(推荐)
将分隔符改为\\s+,它会匹配任意数量的连续空格、制表符等空白字符,自动合并分隔符,避免生成空列:
dat <- vroom(file = fname, delim = "\\s+", col_names = FALSE, comment = "%", na = "NaN")
2. 固定宽度解析(适配伯克利地球数据特性)
伯克利地球的这类气温数据通常是固定列宽格式,可以直接指定列的起止位置来读取:
# 先查看数据前几行确认列宽 sample_lines <- readLines(fname, n = 10) cat(sample_lines, sep = "\n") # 根据实际列宽设置,示例参数需根据实际调整 dat <- vroom(fname, comment = "%", na = "NaN", col_positions = fwf_positions( start = c(1, 7, 11, 16, 20, 25, 30, 35, 40, 45, 50), end = c(6, 10, 15, 19, 24, 29, 34, 39, 44, 49, 55) ), col_names = FALSE)
3. 检查数据格式变更
如果上述方法无效,先读取几行数据确认格式是否变化:
sample_lines <- readLines(fname, n = 5) cat(sample_lines, sep = "\n")
根据输出的实际格式调整读取参数即可。
内容的提问来源于stack exchange,提问作者user111024
相关产品推荐
相关产品推荐

