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

使用R tidyverse加载NOAA ONI数据的报错及数据偏移问题求解

问题1:列类型冲突报错的解决方法

报错的根本原因是read_table自动识别列类型时,部分列因为存在异常字符/缺失标记被识别为字符型,和其他数值型列在长宽转换时无法合并。
你可以在读取数据时强制指定所有列为数值型,修改代码如下:

library(tidyverse)
ONI <- read_table("https://psl.noaa.gov/data/correlation/oni.data",
                  skip = 1, 
                  n_max = 74,
                  col_names = FALSE,
                  # 新增这行强制所有列读取为双精度数值
                  col_types = cols(.default = col_double())) %>%
  set_names(c('year', month.abb)) %>%
  pivot_longer(-year, 
               names_to = 'month',
               values_to = 'ONI') %>%
  # 可选:按需求格式化年月字段
  mutate(YearMonth = paste(year, tolower(month))) %>%
  select(YearMonth, ONI)

head(ONI)

问题2:数值偏移错位的解决方法

数值偏移是因为跳过的行数不符合源数据的实际结构:源数据第一行为说明行,第二行为空行,你设置skip=1仅跳过了说明行,空行会被识别为第一行数据,导致后续所有行列值错位。
只需要把skip参数调整为2即可修复错位问题:

ONI <- read_table("https://psl.noaa.gov/data/correlation/oni.data",
                  # 跳过2行非数据内容
                  skip = 2, 
                  n_max = 74,
                  col_names = FALSE,
                  col_types = cols(.default = col_double())) %>%
  set_names(c('year', month.abb)) %>%
  pivot_longer(-year, 
               names_to = 'month',
               values_to = 'ONI') %>%
  mutate(YearMonth = paste(year, tolower(month))) %>%
  select(YearMonth, ONI)

运行后1950年1月的ONI值就会和实际值-1.53一致。

内容的提问来源于stack exchange,提问作者Rodrigo H. Ozon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:36:03