如何在R中针对MAG≥5事件检索原数据框10天内50km范围的地震事件
解决在原数据框中检索关联地震事件的问题
嘿,我帮你调整下代码,让它能在整个原数据框df里检索符合要求的地震事件~你的原代码问题在于只在震级≥5的子集t里筛选时间窗口内的事件,现在我们要把检索范围扩大到整个df。
修改后的基础循环版本
library(dplyr) library(lubridate) library(geosphere) # 先保留震级≥5的事件子集 t <- filter(df, MAG >= 5) # 遍历每个t中的地震事件 for (i in 1:nrow(t)) { # 1. 从原数据框df中筛选当前事件10天时间窗口内的所有事件 current_event_time <- t$time[i] time_window_events <- df %>% filter(time >= current_event_time, time <= current_event_time + days(10)) # 2. 获取当前事件的经纬度,以及窗口内所有事件的经纬度 current_coords <- t[i, c("LON", "LAT")] window_coords <- time_window_events[, c("LON", "LAT")] # 3. 计算当前事件与窗口内所有事件的距离(单位:米) distances <- distm(current_coords, window_coords)[1, ] # 4. 筛选出距离≤50公里且不是当前事件本身的记录 target_events <- time_window_events[distances <= 50000 & distances != 0, ] # 输出结果(你也可以把结果存储到列表,方便后续分析) print(target_events) }
关键修改点说明:
- 把原来从
t子集筛选时间窗口的逻辑,改成从**原数据框df**中筛选time_window_events,这样就包含了所有符合时间条件的地震,不管震级是否达标 - 单独提取当前事件的经纬度,和窗口内所有事件的经纬度计算距离,而不是在
t子集内计算距离矩阵 - 最终从
time_window_events(即原数据框的时间窗口子集)里筛选符合距离条件的事件
更高效的dplyr+purrr优化版本
如果觉得循环代码不够简洁,也可以用purrr包来实现向量式操作,代码更易读且维护性更强:
library(dplyr) library(lubridate) library(geosphere) library(purrr) # 定义一个函数:输入t中的一行事件,返回df中符合条件的关联事件 find_related_quakes <- function(current_event) { current_time <- current_event$time current_coords <- current_event %>% select(LON, LAT) df %>% # 筛选时间窗口内的所有事件 filter(time >= current_time, time <= current_time + days(10)) %>% # 计算当前事件与窗口内每个事件的距离 mutate(distance_to_current = distm(current_coords, select(., LON, LAT))[1, ]) %>% # 筛选距离≤50km且排除自身的事件 filter(distance_to_current <= 50000, distance_to_current != 0) } # 对t中的每一行事件应用函数,得到所有关联事件的列表 related_quakes_list <- map(t, find_related_quakes) # 如果需要把所有结果合并成一个完整的数据框 all_related_quakes <- bind_rows(related_quakes_list)
这个版本用管道操作串联逻辑,避免了嵌套循环,而且可以轻松把结果存储为列表或合并成数据框,方便后续的统计分析。
内容的提问来源于stack exchange,提问作者lukeeddyolpe
相关产品推荐
相关产品推荐

