如何在R中按|分割字符串并提取堪萨斯州HDD数据
解决NOAA HDD数据提取与整理问题
问题根源
你的代码存在两个核心问题:
str_replace_all中|是正则表达式的特殊字符(表示“或”),未转义导致替换完全失效,需写成\\|才能匹配真实分隔符- 循环中用
c(HDD_data, data_KS)拼接数据框会破坏原有结构,应该用行绑定的方式合并数据
修正后的完整代码
library(readr) library(dplyr) library(purrr) library(stringr) # 定义目标年份范围:1999-2023 annees <- as.character(1999:2023) base_url <- "https://ftp.cpc.ncep.noaa.gov/htdocs/degree_days/weighted/daily_data/" # 批量读取所有年份文件,提取堪萨斯州(第18行)的数据 hdd_ks_list <- map(annees, function(year) { file_url <- paste0(base_url, year, "/StatesCONUS.Heating.txt") # 按|分割读取文件 data_year <- read_delim(file_url, delim = "|", col_names = FALSE) # 提取KS行并添加年份标记 data_ks <- data_year[18, ] %>% mutate(year = year) return(data_ks) }) # 合并所有年份的KS数据 hdd_ks_all <- bind_rows(hdd_ks_list) # 清洗并整理数据:分割字符串、提取每日HDD值 clean_hdd <- hdd_ks_all %>% rowwise() %>% mutate( # 转义|分割字符串,去掉第一个元素(州代码KS)并转数值 hdd_values = list(str_split(X1, "\\|")[[1]] %>% tail(-1) %>% as.numeric()) ) %>% unnest_wider(hdd_values, names_sep = "_") %>% # 重命名日期列 rename_with(~ str_replace(., "hdd_values_", "day_"), starts_with("hdd_values")) %>% select(year, starts_with("day_")) # 生成年度HDD总和表格(年份为列,总和为行) annual_total <- clean_hdd %>% rowwise() %>% mutate(total_hdd = sum(c_across(starts_with("day_")), na.rm = TRUE)) %>% select(year, total_hdd) %>% pivot_wider(names_from = year, values_from = total_hdd)
代码说明
- 批量读取优化:用
purrr::map替代循环,避免数据结构混乱,同时为每条数据添加年份标记 - 字符串分割修正:用
\\|转义分隔符,分割后剔除州代码,直接转换为数值类型 - 数据整理:
unnest_wider将每日HDD值展开为独立列,生成day_1到day_366的日期列annual_total是最终符合需求的表格:年份为列,年度HDD总和为行
内容的提问来源于stack exchange,提问作者ally
相关产品推荐
相关产品推荐

