【问题标题】:Successive nearest neighbors in RR中的连续最近邻
【发布时间】:2020-01-22 09:18:10
【问题描述】:

我在包含 X 和 Y 坐标的数据框中有 n 个数据点。我想取任意一点(以下称为第一个点),找到它的最近邻(即第二个点),然后找到除第一个点之外的距离第二个点(即第三个点)最近的点,然后找到距离除第一个和第二个点之外的第三个点最近的邻居,依此类推。我想在数据框中添加两列:一列包含数字(第一个点为 1,第二个点为 2,依此类推),另一列包含距离值,这样每个点的值就是到通过上述规则确定的下一个最近点的距离。我想知道是否有一个包或一组最小的 R 代码可以做到这一点。

示例数据:

structure(list(sanimusho = 1:10, Latitude = c(41.84752, 41.84665, 41.84478, 41.84365, 41.84683, 41.84856, 41.84653, 41.8452, 41.8457, 41.84446), Longitude = c(44.98355, 44.98944, 45.04445, 45.04428, 45.04112, 45.03329, 45.03202, 45.02737, 45.01077, 45.01041),     Altitude = c(1435L, 1455L, 1545L, 1509L, 1588L, 1668L, 1574L,     1556L, 1479L, 1446L), fartobi = c(18.4, 19.8, 18.6, 18.4,     18.2, 18.2, 18.4, 19.4, 18.4, 18.2), X = c(498634.403, 499123.349,     503690.176, 503676.128, 503413.615, 502763.526, 502658.183,     502272.204, 500894.097, 500864.228), Y = c(4632846.902, 4632750.232,     4632543.515, 4632418.048, 4632770.98, 4632962.773, 4632737.351,     4632589.553, 4632644.76, 4632507.084)), class = "data.frame", row.names = c(NA, -10L))

【问题讨论】:

  • 你能提供一些示例数据吗?
  • sanimusho,纬度,经度,海拔,fartobi,x,y 1,41.84752,44.98355,1435,18.4,498634.403403,4632846.902,9022,9022,844444444.8444.8444.8444.844.844.844.844.844.844.,,, ,45.04445,1545,18.6,503690.176,4632543.515 4,41.84365,45.04428,1509,18.4,503676.128,4632418.048 5,41.84683,45.04112,1588,18.2,503413.615,4632770.98 6,41.84856,45.03329,1668,18.2,502763.526,4632962.773 7 ,41.84653,45.03202,1574,18.4,502658.183,4632737.351 8,41.8452,45.02737,1556,19.4,502272.204,4632589.553 9,41.8457,45.01077,1479,18.4,500894.097,4632644.76 10,41.84446,45.01041,1446,18.2,500864.228, 4632507.084
  • @Lexo 这不是您应该提供数据的方式。在您的数据样本上使用dput 以生成复制数据所需的代码

标签: r


【解决方案1】:

这是一个使用dplyr 和循环的解决方案,适用于示例数据。我将其作为逆向工程的练习。

library(dplyr)

# df <- my_sample_data
first_point <- 1

neighbors_df <- tibble(sanimusho = numeric(), sanimusho_nb = numeric())

for(i in seq(nrow(df))) {
  next_neighbor <- df %>%
    filter(sanimusho == tail(c(first_point, neighbors_df$sanimusho_nb), 1)) %>%
    merge(select(df, sanimusho_nb = sanimusho, X_nb = X, Y_nb = Y)) %>%
    mutate(dist_nb = sqrt((X - X_nb) ^ 2 + (Y - Y_nb) ^ 2)) %>%
    filter(sanimusho != sanimusho_nb, !(sanimusho_nb %in% neighbors_df$sanimusho)) %>%
    top_n(-1, dist_nb + row_number()) %>%
    select(-X_nb, -Y_nb)

  if (nrow(next_neighbor) > 0) {
    neighbors_df <- bind_rows(neighbors_df, next_neighbor)
  } else {
    neighbors_df <- bind_rows(neighbors_df, filter(df, sanimusho == tail(neighbors_df$sanimusho_nb, 1)))
    break
  }
}

结果:

# A tibble: 10 x 9
   sanimusho sanimusho_nb Latitude Longitude Altitude fartobi       X        Y dist_nb
       <dbl>        <dbl>    <dbl>     <dbl>    <int>   <dbl>   <dbl>    <dbl>   <dbl>
 1         1            2     41.8      45.0     1435    18.4 498634. 4632847.    498.
 2         2           10     41.8      45.0     1455    19.8 499123. 4632750.   1758.
 3        10            9     41.8      45.0     1446    18.2 500864. 4632507.    141.
 4         9            8     41.8      45.0     1479    18.4 500894. 4632645.   1379.
 5         8            7     41.8      45.0     1556    19.4 502272. 4632590.    413.
 6         7            6     41.8      45.0     1574    18.4 502658. 4632737.    249.
 7         6            5     41.8      45.0     1668    18.2 502764. 4632963.    678.
 8         5            3     41.8      45.0     1588    18.2 503414. 4632771.    358.
 9         3            4     41.8      45.0     1545    18.6 503690. 4632544.    126.
10         4           NA     41.8      45.0     1509    18.4 503676. 4632418.     NA

【讨论】:

    猜你喜欢
    • 2016-10-08
    • 2018-01-30
    • 2015-03-04
    • 2018-05-19
    • 2021-10-04
    • 2012-08-22
    • 2020-06-15
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多