You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:57:34