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 为您提供千米。