Рассмотрите подход на основе наборов с использованием merge
и избегайте вложенных циклов for
. В частности, запустите подмножество перекрестных соединений, сопоставив землетрясения силой более 5 баллов с каждым другим землетрясением в течение 10 дней и 50 км. При N = 4000 строк ниже должно быть возможным. Ниже используется базовый код R, но его можно настроить для методов dplyr (filter
, inner_join
, arrange
).
mag5_df <- subset(df, MAG >= 5)
# CROSS JOIN PAIRING OF MAG 5 EVENTS AND ALL OTHER EARTHQUAKES WITHIN 10 DAYS
merge_df <- subset(merge(mag5, df, by=NULL, suffixes=c("", "_")),
time_ >= time & time_ <= time + lubridate::days(10))
# CALCULATE DISTANCE BETWEEN LAT/LON PAIRS
merge_df$dist_m <- geosphere::distVincentyEllipsoid(merge_df[c("LON", "LAT")],
merge_df[c("LON_", "LAT_")])
# SUBSET TO WITHIN 50 KM AND ORDER OUTPUT BY MAG 5 LAT/LON, TIME, AND DISTANCE
near50km_df <- subset(merge_df, dist_m > 0 & dist_m <= 5E4)
near50km_df <- data.frame(with(near50km_df, near50km_df[order(LAT, LON, time, dist_m),],
row.names = NULL)
# DISPLAY ALL MAG 5 EVENTS AND QUALIFIED PAIRS
near50km_df