我有两个存储点数据的数据框。一个包含 6 个点 (df1.sf),另一个包含 20,000 多个点 (df2.sf)。我想计算 df2 中的每个点与 df1 中的每个点之间的距离(一对多,重复六次),然后生成某种输出,指示 df1 中的 6 个点中哪一个最接近每个点df2 的点。这是我到目前为止所得到的:
dist <- function(a){
dt <- data.table(as.numeric(sf::st_distance(df1.sf$borderpoints, a)))
return(which.min(dt$V1))}
results <- df2.sf[, j = list(Closest = dist(df2.sf)), by = 1:nrow(df2.sf)]
Error in .subset(x, j) : invalid subscript type 'list'
但这一直给我“.subset(x, j) 中的错误:无效的下标类型“列表””。我对 R 很陌生,所以怀疑我做错了什么 - 非常感谢任何提示,无论是如何修复下面的代码,还是有更好的方法来处理问题。
在这里,我为您提供了一个可重现的示例,展示了如何计算
dat_p2
和 dat_p1
中每个值之间的绝对差异,然后以包含每个 p2_label
中差异最小的观察值的小标题结尾(请注意,可以有多个)。
library(tidyverse)
set.seed(345)
dat_p1 <- tibble(
p1_label = LETTERS[1:6],
p1_val = round(runif(6, 1, 30))
)
dat_p2 <- tibble(
p2_label = 1:15,
p2_val = round(runif(15, 1, 30))
)
crossing(dat_p1, dat_p2) %>%
mutate(diff_abs = abs(p2_val - p1_val)) %>%
group_by(p2_label) %>%
filter(diff_abs == min(diff_abs)) %>%
ungroup() %>%
arrange(p2_label)