表X包含组和测量坐标的列表,例如:
X:
(组,测量坐标(
A 10
A 20
B 10
表Y包含感兴趣的坐标列表,例如
Y:
(组,有趣的坐标(
A3
A5
A25
B15
我想在给定X坐标的情况下,找到Y中最接近的感兴趣坐标之间的距离,所以输出将是
Z
(组、测量坐标、到最近的较低坐标的距离、到最近较高坐标的距离(
A 10 7 15
20 13 5
B 25 10 NA
你知道如何在tidyverse/R中做到这一点吗?
这里有一种方法。该代码创建一个标志,查看它是每组group
和coordinate
中的第一行还是最后一行。然后计算距离并将其重塑为宽格式。可能有更简单的方法,但它能满足问题的要求。
library(dplyr)
library(tidyr)
left_join(X, Y, by = "group", suffix = c("", ".y")) %>%
group_by(group) %>%
mutate(flag = cumsum(c(TRUE, diff(coordinate) == 0L))) %>%
group_by(group, coordinate) %>%
mutate(flag = flag == first(flag) | flag == last(flag)) %>%
filter(flag) %>%
select(-flag) %>%
mutate(distance = abs(coordinate - coordinate.y),
which_dist = ifelse(row_number() == 1L, "first", "last")) %>%
select(-coordinate.y) %>%
pivot_wider(
id_cols = -distance,
names_from = which_dist,
values_from = distance
)
## A tibble: 3 x 4
## Groups: group, coordinate [3]
# group coordinate first last
# <chr> <int> <int> <int>
#1 A 10 7 15
#2 A 20 17 5
#3 B 10 5 NA