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

在R中规整行长度不一致的大西洋飓风数据集

向量化处理飓风轨迹数据集(R语言实现)

针对你需要将风暴ID和名称匹配到对应轨迹行的需求,完全可以用向量化操作实现,避免低效的循环,以下是两种规范的实现方式:

方法一:Base R 原生向量化实现

# 1. 读取原始数据(假设数据文件名为hurricanes.txt)
raw_lines <- readLines("hurricanes.txt")
# 过滤空行
raw_lines <- raw_lines[nzchar(raw_lines)]

# 2. 识别风暴头行(以AL开头)
is_header <- grepl("^AL", raw_lines)
header_lines <- raw_lines[is_header]
track_lines <- raw_lines[!is_header]

# 3. 解析头行数据:分割为ID、名称、轨迹行数
header_df <- read.table(text = header_lines, sep = ",", stringsAsFactors = FALSE,
                        col.names = c("storm_id", "storm_name", "track_count"))
header_df$track_count <- as.integer(header_df$track_count)

# 4. 向量化生成重复的ID和名称(核心:用rep实现对应次数的重复)
repeat_ids <- rep(header_df$storm_id, header_df$track_count)
repeat_names <- rep(header_df$storm_name, header_df$track_count)

# 5. 解析轨迹行数据
track_df <- read.table(text = track_lines, sep = ",", stringsAsFactors = FALSE,
                       col.names = c("date", "time", "status_flag", "storm_type", "lat", "lon"))
# 处理日期:去掉开头的"1"(如18510625 → 8510625)
track_df$date <- substr(track_df$date, 2, 8)

# 6. 合并数据
result_df <- cbind(data.frame(storm_id = repeat_ids, storm_name = repeat_names), track_df)

# 输出为指定格式(可选)
write.table(result_df, "formatted_hurricanes.txt", sep = ",", row.names = FALSE, quote = FALSE)

方法二:Tidyverse 向量化实现

如果你习惯用tidyverse工具链,代码更简洁:

library(tidyverse)

# 读取并预处理数据
raw_data <- read_lines("hurricanes.txt") %>%
  discard(str_detect(., "^\\s*$"))

# 分离头行和轨迹行
header_data <- raw_data[str_detect(raw_data, "^AL")] %>%
  read_delim(delim = ",", col_names = c("storm_id", "storm_name", "track_count"),
             trim_ws = TRUE, col_types = cols(track_count = col_integer()))

track_data <- raw_data[!str_detect(raw_data, "^AL")] %>%
  read_delim(delim = ",", col_names = c("date", "time", "status_flag", "storm_type", "lat", "lon"),
             trim_ws = TRUE) %>%
  mutate(date = str_sub(date, 2, 8))

# 向量化匹配并合并(核心:用uncount扩展头行到对应轨迹行数)
result_df <- header_data %>%
  uncount(track_count) %>%
  bind_cols(track_data)

# 输出
write_delim(result_df, "formatted_hurricanes.txt", delim = ",", quote = FALSE)

关键向量化逻辑说明

两种方法的核心都是利用向量化重复/扩展操作:

  • Base R 中用rep()函数,根据每个风暴的轨迹行数,将对应的ID和名称重复指定次数,无需循环遍历每个风暴
  • Tidyverse 中用uncount()函数,直接将头行按轨迹行数扩展,本质也是向量化实现

这种方式处理57000行的数据集效率很高,完全符合规范的向量化编程思路。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:59:55