我有两个表,d1 和 d2,它们只包含笛卡尔点及其名称。它们看起来像这样:
d1:
x1 y1 point
1 -36.70045 -35.57741 a
2 -31.71920 -31.95160 b
3 -33.42082 -32.52115 c
4 -35.01071 -32.14848 d
5 -30.82340 -35.35468 e
6 -32.48995 -35.91305 f
7 -31.13327 -35.50498 g
8 -33.14196 -37.89258 h
9 -35.11322 -32.48860 i
10 -33.04845 -34.96242 j
d2:
x2 y2 point
1 -21.84797 -27.29278 k
2 -27.96603 -21.43688 l
3 -24.57574 -25.98523 m
4 -20.21674 -26.02366 n
5 -22.54094 -26.86359 o
6 -27.66791 -25.16078 p
7 -20.78323 -20.54069 q
8 -27.26773 -23.25467 r
9 -26.76333 -25.70280 s
10 -20.38453 -23.92657 t
我正在使用我们在小学学到的一个简单的距离公式,它取两个点并计算它们之间的距离
dist(x1 = , x2 =, y1 = , y2 = )
我知道这对某些人来说可能微不足道,但请耐心等待。我想通过 d1 并将每个点与 d2 中的点进行比较,以找出哪个点最接近 d1 中的点。我想向 d1 添加一行,其中包含最近点的距离和该点的名称。
例如,我希望我的函数从 d1 中的点“a”开始,并将其插入函数中的 x1 和 y1。对于距离函数中的 x2 和 y2,我希望它循环 d2 并插入点 k - t。然后,我需要它返回到最近点的距离及其点名。我试过双循环但似乎没有任何效果。我知道,凭借您出色的洞察力,我离精通 R 更近了一步!
最佳答案
使用tidyverse
策略,可能更容易理解(也许)
- 我使用
purrr::map2_*
函数对d2< 的所有值迭代
d1$x1
和d1$y1
/ map
函数中的语法也是用 tidyverse 风格编写的- 首先,对于给定的两个参数,
dist
中的距离变量dist
发生变异 - 其次,
d2
被过滤为dist
的min
- 最后,
point
是pull
点,dist
是pull
距离。
- 首先,对于给定的两个参数,
d1 <- read.table(text = ' x1 y1 point
1 -36.70045 -35.57741 a
2 -31.71920 -31.95160 b
3 -33.42082 -32.52115 c
4 -35.01071 -32.14848 d
5 -30.82340 -35.35468 e
6 -32.48995 -35.91305 f
7 -31.13327 -35.50498 g
8 -33.14196 -37.89258 h
9 -35.11322 -32.48860 i
10 -33.04845 -34.96242 j', header = T)
d2 <- read.table(text = ' x2 y2 point
1 -21.84797 -27.29278 k
2 -27.96603 -21.43688 l
3 -24.57574 -25.98523 m
4 -20.21674 -26.02366 n
5 -22.54094 -26.86359 o
6 -27.66791 -25.16078 p
7 -20.78323 -20.54069 q
8 -27.26773 -23.25467 r
9 -26.76333 -25.70280 s
10 -20.38453 -23.92657 t', header = T)
suppressMessages(library(tidyverse))
d1 %>% mutate(nearest_point = map2_chr(x1, y1, ~ d2 %>% mutate(dist = sqrt((x2 - .x)^2 + (y2 - .y)^2)
) %>%
filter(dist == min(dist)) %>%
pull(point)
),
shortest_dist = map2_dbl(x1, y1, ~ d2 %>% mutate(dist = sqrt((x2 - .x)^2 + (y2 - .y)^2)
) %>%
filter(dist == min(dist)) %>%
pull(dist)
)
)
#> x1 y1 point nearest_point shortest_dist
#> 1 -36.70045 -35.57741 a p 13.787420
#> 2 -31.71920 -31.95160 b p 7.907477
#> 3 -33.42082 -32.52115 c p 9.341896
#> 4 -35.01071 -32.14848 d p 10.136304
#> 5 -30.82340 -35.35468 e s 10.471053
#> 6 -32.48995 -35.91305 f s 11.706553
#> 7 -31.13327 -35.50498 g s 10.732153
#> 8 -33.14196 -37.89258 h s 13.757822
#> 9 -35.11322 -32.48860 i p 10.446511
#> 10 -33.04845 -34.96242 j p 11.181340
由 reprex package 创建于 2021-04-29 (v2.0.0)
关于r - 通过遍历两个表来应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67310706/