私はデータフレームを持っています
head(df)
time LON LAT MAG
1 1965-01-12 13:32:25 87.8286 27.3829 6.1
2 1965-01-12 13:55:20 87.6567 27.3269 5.3
3 1965-02-18 04:26:36 94.1127 25.0251 5.5
4 1965-02-25 10:34:07 94.5712 23.6672 5.3
5 1965-04-11 22:33:05 92.2023 26.6941 5.1
6 1965-04-30 07:13:25 95.8880 28.3319 4.4
それは地震の時間、場所、規模であり、約4000行が含まれています。
MAG >= 5
イベントをサブセット化しました。そのようなイベントごとに、イベントから10日以内に確認したいと思います。次に、各MAG >= 5
イベントのこの10日間の時間枠で、半径50km以内のイベントを出力します。
library(dplyr)
library(lubridate)
library(geosphere)
t <- filter(df, MAG >= 5)
for (i in 1:nrow(t)){
data1 <- filter(t, time <= time[i] + days(10) & time >= time[i])
p <- select(data1, LON, LAT)
l <- distm(p)[1,] # first row of the distance matrix between each event
for (j in 1:length(l)){
if (l[j] <= 50000 & l[j] != 0){ # within 50 kms and excluding the event itself
print(data1[j,])
}
}
}
ただし、これはデータフレーム内の値のみをチェックしますt
。MAG >= 5
元のデータフレームでイベントから10日以内に確認するにはどうすればよいですかdf
merge
ネストされたfor
ループを使用して回避するセットベースのアプローチを検討してください。具体的には、10日50 km以内に、5等を超える地震を他のすべての地震イベントと一致させるサブセット化クロスジョインを実行します。N = 4,000の場合、以下の行が実行可能であるはずです。用途基地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
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加