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

如何在R中按|分割字符串并提取堪萨斯州HDD数据

解决NOAA HDD数据提取与整理问题

问题根源

你的代码存在两个核心问题:

  1. str_replace_all中|是正则表达式的特殊字符(表示“或”),未转义导致替换完全失效,需写成\\|才能匹配真实分隔符
  2. 循环中用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)

代码说明

  1. 批量读取优化:用purrr::map替代循环,避免数据结构混乱,同时为每条数据添加年份标记
  2. 字符串分割修正:用\\|转义分隔符,分割后剔除州代码,直接转换为数值类型
  3. 数据整理:
    • unnest_wider将每日HDD值展开为独立列,生成day_1到day_366的日期列
    • annual_total是最终符合需求的表格:年份为列,年度HDD总和为行

内容的提问来源于stack exchange,提问作者ally

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:01:00