gpt4 book ai didi

r - 通过遍历两个表来应用函数

转载 作者:行者123 更新时间:2023-12-04 14:59:07 24 4
gpt4 key购买 nike

我有两个表,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$x1d1$y1/
  • map 函数中的语法也是用 tidyverse 风格编写的
    • 首先,对于给定的两个参数,dist 中的距离变量 dist 发生变异
    • 其次,d2 被过滤为 distmin
    • 最后,pointpull 点,distpull 距离。
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com