在R中处理行列混合的NOAA飓风CSV数据集:数据整理求助
处理NOAA飓风数据的混合列问题
从你提供的数据来看,date_index列混合了飓风标识符(如AL011851)和观测日期,且newname列已经标记了新飓风的起始行(TRUE对应标识符行),可以用以下步骤拆分并整理数据:
步骤1:加载必要的包(首次运行需先安装)
# 安装依赖包 install.packages(c("tidyr", "dplyr", "lubridate")) # 加载包 library(tidyr) library(dplyr) library(lubridate)
步骤2:提取并填充飓风标识符
先从date_index列中提取飓风编号,再向下填充到对应的观测行:
df <- df %>% # 仅在新飓风行记录编号,其余行留空 mutate(hurricane_id = ifelse(newname, date_index, NA)) %>% # 向下填充编号,让每个观测行对应正确的飓风 fill(hurricane_id, .direction = "down")
步骤3:提取并转换观测日期
把date_index中的纯数字日期提取出来,转换成标准日期格式:
df <- df %>% # 仅在观测行提取日期字符串 mutate(raw_date = ifelse(!newname, date_index, NA)) %>% # 填充日期(同一飓风的观测日期通常连续重复) fill(raw_date, .direction = "down") %>% # 转成标准日期格式 mutate(observation_date = ymd(raw_date)) %>% # 删除临时列 select(-raw_date)
步骤4:清理冗余列(可选)
拆分完成后可移除原date_index列,调整列顺序让核心信息前置:
df <- df %>% select(-date_index) %>% relocate(hurricane_id, observation_date)
处理后的数据示例
运行上述代码后,前6行数据会变成这样:
head(df) #> hurricane_id observation_date time n_entries type wind newname #> 1 AL011851 1851-06-25 UNNAMED 14 NA TRUE #> 2 AL011851 1851-06-25 0000 HU 80 FALSE #> 3 AL011851 1851-06-25 0600 HU 80 FALSE #> 4 AL011851 1851-06-25 1200 HU 80 FALSE #> 5 AL011851 1851-06-25 1800 HU 80 FALSE #> 6 AL011851 1851-06-25 2100 L HU 80 FALSE
备选方案(不依赖newname列)
如果newname列不可靠,可直接通过date_index的格式识别:
df <- df %>% # 匹配以两个大写字母开头的飓风编号 mutate(hurricane_id = ifelse(grepl("^[A-Z]{2}", date_index), date_index, NA)) %>% fill(hurricane_id, .direction = "down") %>% # 匹配8位纯数字的日期 mutate(raw_date = ifelse(grepl("^\\d{8}$", date_index), date_index, NA)) %>% fill(raw_date, .direction = "down") %>% mutate(observation_date = ymd(raw_date)) %>% select(-raw_date, -date_index) %>% relocate(hurricane_id, observation_date)
内容的提问来源于stack exchange,提问作者Patrick Stephenson
相关产品推荐
相关产品推荐

