使用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
相关产品推荐
相关产品推荐

