R 如何识别不同点列表中最近的点并将ID存储在列表中
我有两个数据帧,它们在不同的时间点具有不同ID的xy坐标。我想做的是确定上一年中哪个点最接近今年的点,并将该数据存储在列表中。因此,对于这个示例数据:R 如何识别不同点列表中最近的点并将ID存储在列表中,r,for-loop,dplyr,apply,R,For Loop,Dplyr,Apply,我有两个数据帧,它们在不同的时间点具有不同ID的xy坐标。我想做的是确定上一年中哪个点最接近今年的点,并将该数据存储在列表中。因此,对于这个示例数据: oldnames <- c('A', 'B', 'C') oldx <- c(0,5,10) oldy <- c(0,5,10) olddf <- data.frame(oldnames, oldx, oldy) newnames <- c('D','E','F') newx <- c(1, 6, 11) n
oldnames <- c('A', 'B', 'C')
oldx <- c(0,5,10)
oldy <- c(0,5,10)
olddf <- data.frame(oldnames, oldx, oldy)
newnames <- c('D','E','F')
newx <- c(1, 6, 11)
newy <- c(1, 6, 11)
newdf <- data.frame(newnames, newx, newy)
我一直在尝试使用apply(如下所示)执行此操作,但目前它给了我一条错误消息:
(mutate_impl(.data,dots)中出错:
二进制运算符的非数值参数)
有人有什么想法吗
closestdf <- data.frame()
apply(newdf, 1, function(row) {
name <- row["names"]
xID <- row["x"]
yID <- row["y"]
closest <- olddf %>%
mutate(length = sqrt((xID - oldx)^2 + (yID - oldy)^2)) %>%
mutate(rank = min_rank(length)) %>%
filter(rank == '1')%>%
mutate(total = '1')
closestdf <- rbind(closest, closestdf)
})
closestdf不需要apply调用,我们可以在mutate
内部执行purrr
:
library(tidyverse)
newdf %>%
mutate(closest =
map2_chr(newx, newy,
~as.character(olddf$oldnames)[which.min((.x - olddf$oldx) ^ 2 + (.y - olddf$oldy) ^ 2)]
)
)
给出:
如果我们不需要实际距离,就没有理由执行平方根运算
或更清晰详细的中间步骤:
newdf %>%
mutate(dists = map2(newx, newy, ~(.x - olddf$oldx) ^ 2 + (.y - olddf$oldy) ^ 2),
ids = map_dbl(dists, which.min),
closest = olddf$oldnames[ids])
给出:
非常感谢!对于顶级解决方案,应该是[which.min(.x-olddf$oldx^2)+(.y-olddf$oldy)^2)]吗?是的,对不起,我太快了。
newnames newx newy closest
1 D 1 1 A
2 E 6 6 B
3 F 11 101 C
newdf %>%
mutate(dists = map2(newx, newy, ~(.x - olddf$oldx) ^ 2 + (.y - olddf$oldy) ^ 2),
ids = map_dbl(dists, which.min),
closest = olddf$oldnames[ids])
newnames newx newy dists ids closest
1 D 1 1 2, 32, 162 1 A
2 E 6 6 72, 2, 32 2 B
3 F 11 101 10322, 9252, 8282 3 C