【问题标题】:R conditional distance measurementR 条件距离测量
【发布时间】:2021-01-03 09:43:46
【问题描述】:

我正在尝试确定数据集中的距离,但前提是它们满足特定标准。我在这里看到了很多关于确定两点之间距离的示例,但不确定如何指定我想要的点。

数据集(标题为 event.df)如下所示:

        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       

我想说,如果标签 ID 相同,并且日期相同,请计算与这些点的距离(可能大于 2)。

【问题讨论】:

  • 基本思想是按日期和 ID 拆分数据,然后使用您见过的其他解决方案之一。 split_data = split(event.df, paste(event.df$Tag, event.df$Date)), result <- lapply(split_data, <<distance_function>>)
  • 要获得更精确的帮助,请稍微编辑您的示例:看起来您共享的内容中只有第 1 行和第 3 行具有相同的 ID 和日期,因此结果将是一个距离。如果一组中可能有超过 2 个,请在您的示例中包括一组 2 个和一组 3 个。请指定您是否想要欧几里得距离以外的东西(例如,如果 X 和 Y 是经度和纬度)。并请展示您可能希望结果的外观,特别是如果有一组 3 个或更多。是否有一个 ID 列,以便您可以判断距离对应的集合中的哪些点?那么单例行呢?
  • 是的,一组 2 应该只有一个距离。对于 3 个或更多,它可能是与任何点(1、2、3 等)或所有点的距离。欧几里得距离很好。如果日期中没有重复,则应忽略单例行。理想情况下,输出将进入一个新列
  • 感谢您的回答。您能否像我提到的那样编辑您的示例,以便样本数据同时具有一组 2 和一组 3?
  • “对于 3 或更多,它可能是与任何点(1,2,3 等)或所有点的距离”......所以,你不在乎哪个?您想知道哪个 post-hoc 吗?只是在集合中随机选择一个其他点可以吗?

标签: r conditional-statements distance


【解决方案1】:

实际上,与获取所有距离或随机距离相比,添加具有最大距离的单列要容易得多。

这是一种使用dplyr 进行分组的方法:

library(dplyr)

# write a function to find the maximum distance for each point in a group
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 %>%
  group_by(Tag, Date) %>%
  mutate(max_dist_within_group = find_max_dist(X, Y))
# # A tibble: 6 x 5
# # Groups:   Tag, Date [3]
#       X     Y    Tag Date       max_dist_within_group
#   <dbl> <dbl>  <int> <chr>                      <dbl>
# 1  34.4 -7.66 151401 2015-09-22               0.674  
# 2  34.5 -7.02 151401 2015-09-22               0.674  
# 3  34.4 -6.99 151401 2015-10-20               0      
# 4  34.6 -7.80 151402 2015-10-22               0.001  
# 5  34.6 -7.80 151402 2015-10-22               0.00141
# 6  34.6 -7.80 151402 2015-10-22               0.00141

将零用于第一组,但如果您愿意,可以将它们替换为NAs。


使用这些数据:

event.df = read.table(text = "     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", header = TRUE)

【讨论】:

  • 感谢这工作!!我不知道输出似乎是什么单位,因为它不是公里或米
  • 单位是XY 的任何单位。这只是欧几里得距离,就像你要求的那样。 sqrt((x[1] - x[2])^2 + (y[1] - y[2])^2)
  • 我尝试返回并将原始 find_max_distance 中的 'dist' 函数更改为 distHaversine 以计算准确的米距,但得到错误 Error in p[, 4] : subscript out of bounds Col 4是我的 X 变量。没有 NA 并且行是相等的。有什么建议?感谢您的帮助!
猜你喜欢
  • 2019-01-21
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2013-02-13
  • 2021-09-28
  • 2014-04-15
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多