R大圆距离函数(km)
R great circle distance function in km
我有一个数据集和一个函数,用于确定重复 tag/day 点之间的距离。但是我正在尝试更改函数,以便输出以 Km 距离而不是原始 lat/long 格式
数据:
X Y Tag Date
34.355 -7.662 151401 2015-09-22
34.546 -7.016 151401 2015-09-22
34.425 -6.987 151401 2015-10-20
34.554 -7.803 151402 2015-10-22
34.555 -7.803 151402 2015-10-22
34.554 -7.804 151402 2015-10-22
函数:
find_max_dist = function(x, y) {
cbind(x, y) %>% dist %>% as.matrix %>% apply(1, max)
}
# use dplyr to run the function by group and put the result in a column
event.df <- event.df %>%
group_by(Tag, Date) %>%
mutate(Sameday_travel = find_max_dist(X, Y))
一组的输出结果:
Sameday_travel
0.0918
0.0918
我想说 10.13(这是以公里为单位的距离)。我尝试在 find_max_dist 函数中用 distHaversine 替换 dist 但 X 列出现错误,该列没有 NA 或长度错误。我认为它与 as.matrix 有关,但不确定如何修复它??:
错误:
p[ 1] 错误:下标越界
试试这个:
event.df %>%
group_by(Tag, Date) %>%
mutate(sdt = if (n() > 1) c(NA, geosphere::distHaversine(cbind(X, Y))/1000) else NA) %>%
ungroup()
# # A tibble: 6 x 5
# X Y Tag Date sdt
# <dbl> <dbl> <int> <date> <dbl>
# 1 34.4 -7.66 151401 2015-09-22 NA
# 2 34.5 -7.02 151401 2015-09-22 74.9
# 3 34.4 -6.99 151401 2015-10-20 NA
# 4 34.6 -7.80 151402 2015-10-22 NA
# 5 34.6 -7.80 151402 2015-10-22 0.110
# 6 34.6 -7.80 151402 2015-10-22 0.157
这提供了每天 的距离,而不是最大距离(目前)。如果您需要保留有关它的任何信息,这会很有用 per-day。如果你想直接切到最大,那么你可以在这之后总结一下,或者改为:
event.df %>%
group_by(Tag, Date) %>%
summarize(
sdt = if (n() > 1) max(geosphere::distHaversine(cbind(X, Y))/1000) else NA,
.groups = "drop"
)
# # A tibble: 3 x 3
# Tag Date sdt
# <int> <date> <dbl>
# 1 151401 2015-09-22 74.9
# 2 151401 2015-10-20 NA
# 3 151402 2015-10-22 0.157
event.df %>%
group_by(Tag, Date) %>%
mutate(sdt = if (n() > 1) c(NA, geosphere::distHaversine(cbind(X, Y))/1000) else NA) %>%
summarize(sdt = if (any(!is.na(sdt))) max(sdt, na.rm = TRUE) else NA) %>%
ungroup()
# # A tibble: 3 x 3
# Tag Date sdt
# <int> <date> <dbl>
# 1 151401 2015-09-22 74.9
# 2 151401 2015-10-20 NA
# 3 151402 2015-10-22 0.157
由于 geosphere
倾向于以米为单位,因此 /1000
为您提供千米。
我有一个数据集和一个函数,用于确定重复 tag/day 点之间的距离。但是我正在尝试更改函数,以便输出以 Km 距离而不是原始 lat/long 格式
数据:
X Y Tag Date
34.355 -7.662 151401 2015-09-22
34.546 -7.016 151401 2015-09-22
34.425 -6.987 151401 2015-10-20
34.554 -7.803 151402 2015-10-22
34.555 -7.803 151402 2015-10-22
34.554 -7.804 151402 2015-10-22
函数:
find_max_dist = function(x, y) {
cbind(x, y) %>% dist %>% as.matrix %>% apply(1, max)
}
# use dplyr to run the function by group and put the result in a column
event.df <- event.df %>%
group_by(Tag, Date) %>%
mutate(Sameday_travel = find_max_dist(X, Y))
一组的输出结果:
Sameday_travel
0.0918
0.0918
我想说 10.13(这是以公里为单位的距离)。我尝试在 find_max_dist 函数中用 distHaversine 替换 dist 但 X 列出现错误,该列没有 NA 或长度错误。我认为它与 as.matrix 有关,但不确定如何修复它??: 错误: p[ 1] 错误:下标越界
试试这个:
event.df %>%
group_by(Tag, Date) %>%
mutate(sdt = if (n() > 1) c(NA, geosphere::distHaversine(cbind(X, Y))/1000) else NA) %>%
ungroup()
# # A tibble: 6 x 5
# X Y Tag Date sdt
# <dbl> <dbl> <int> <date> <dbl>
# 1 34.4 -7.66 151401 2015-09-22 NA
# 2 34.5 -7.02 151401 2015-09-22 74.9
# 3 34.4 -6.99 151401 2015-10-20 NA
# 4 34.6 -7.80 151402 2015-10-22 NA
# 5 34.6 -7.80 151402 2015-10-22 0.110
# 6 34.6 -7.80 151402 2015-10-22 0.157
这提供了每天 的距离,而不是最大距离(目前)。如果您需要保留有关它的任何信息,这会很有用 per-day。如果你想直接切到最大,那么你可以在这之后总结一下,或者改为:
event.df %>%
group_by(Tag, Date) %>%
summarize(
sdt = if (n() > 1) max(geosphere::distHaversine(cbind(X, Y))/1000) else NA,
.groups = "drop"
)
# # A tibble: 3 x 3
# Tag Date sdt
# <int> <date> <dbl>
# 1 151401 2015-09-22 74.9
# 2 151401 2015-10-20 NA
# 3 151402 2015-10-22 0.157
event.df %>%
group_by(Tag, Date) %>%
mutate(sdt = if (n() > 1) c(NA, geosphere::distHaversine(cbind(X, Y))/1000) else NA) %>%
summarize(sdt = if (any(!is.na(sdt))) max(sdt, na.rm = TRUE) else NA) %>%
ungroup()
# # A tibble: 3 x 3
# Tag Date sdt
# <int> <date> <dbl>
# 1 151401 2015-09-22 74.9
# 2 151401 2015-10-20 NA
# 3 151402 2015-10-22 0.157
由于 geosphere
倾向于以米为单位,因此 /1000
为您提供千米。