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

标签 r function dataframe loops

我有两个表,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/

相关文章:

python - 如何通过聚合摆脱 Pandas 中的嵌套列名?

r - 合并(与拆分相反)r 中的行对

r - 如何在 [R] 中自动添加图例?

R:对于两个数据框共享的列中的给定变量值,将数据框 x 中的行名称与数据框 y 中的列名称进行匹配

r - 根据列条件连接数据框行

function - Scala:尾递归幂函数

c - 尝试实现泛洪填充时出现段错误

c++ - C++函数重载的汇编等效项是什么?

r - 基于另一列从数据框列中提取值?

r - 使用前 n 个非 NA 元素创建新数据框