Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何识别不同点列表中最近的点并将ID存储在列表中_R_For Loop_Dplyr_Apply - Fatal编程技术网

R 如何识别不同点列表中最近的点并将ID存储在列表中

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

我有两个数据帧,它们在不同的时间点具有不同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)
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