Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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 从其他数据帧查找最近点_R_Dataframe_Distance_Nearest Neighbor - Fatal编程技术网

R 从其他数据帧查找最近点

R 从其他数据帧查找最近点,r,dataframe,distance,nearest-neighbor,R,Dataframe,Distance,Nearest Neighbor,我有两个数据框,一个是80万行x和Y坐标,另一个是70000行x和Y坐标。我想知道R中的逻辑和代码,其中我想将第1帧中的数据点与第2帧中最近的点关联起来。是否有任何标准包可以这样做 我正在运行嵌套循环。但这是非常缓慢的,因为它被迭代了80万*70000次,这非常耗时。我发现了一种使用数据获得预期结果的更快方法。表库: library(data.table) time0 <- Sys.time() 第一个解决方案似乎比另外两个要快得多。对于更大的数据集更是如此。我发现了一种使用数据获得预

我有两个数据框,一个是80万行x和Y坐标,另一个是70000行x和Y坐标。我想知道R中的逻辑和代码,其中我想将第1帧中的数据点与第2帧中最近的点关联起来。是否有任何标准包可以这样做


我正在运行嵌套循环。但这是非常缓慢的,因为它被迭代了80万*70000次,这非常耗时。

我发现了一种使用
数据获得预期结果的更快方法。表
库:

library(data.table)

time0 <- Sys.time()

第一个解决方案似乎比另外两个要快得多。对于更大的数据集更是如此。

我发现了一种使用
数据获得预期结果的更快方法。表
库:

library(data.table)

time0 <- Sys.time()

第一个解决方案似乎比另外两个要快得多。对于更大的数据集更是如此。

请添加一些数据(仅一个片段,例如使用
dput(head(your_data))
)、代码和预期输出。有关地理空间数据,请参阅,有关欧几里德距离,请参阅和。我通过谷歌搜索
r计算两个数据帧之间的距离找到了这些。另外,通过谷歌搜索的其他点击,已经有很多可用的数据。请添加一些数据(仅一个片段,例如使用
dput(head(your_data))
)、代码和预期输出。有关地理空间数据,请参阅,有关欧几里德距离,请参阅和。我通过谷歌搜索
r计算两个数据帧之间的距离找到了这些。再看看谷歌搜索的其他点击,已经有很多了。+1!在这个问题上,人们已经提出了解决方案:。我很想看看你的解决方案与这些方案相比有什么不同(我认为应该快一点)。@PaulHiemstra这不是一个完美的骗局吗?@Frank我不确定,因为在另一篇文章中建议的解决方案可能不适合这种大小的数据帧…谢谢Frank,我使用了您的逻辑并构建了如下代码--@frank这里的解决方案使用data.table,因此可能非常快。+1!在这个问题上,人们已经提出了解决方案:。我很想看看你的解决方案与这些方案相比有什么不同(我认为应该快一点)。@PaulHiemstra这不是一个完美的骗局吗?@Frank我不确定,因为在另一篇文章中建议的解决方案可能不适合这种大小的数据帧…谢谢Frank,我使用了您的逻辑并构建了如下代码--@frank这里的解决方案使用data.table,因此可能相当快。
dist <- function(a, b){
                dt <- data.table((df2$x-a)^2+(df2$y-b)^2)
                return(which.min(dt$V1))}
results <- df1[, j = list(Closest =  dist(x, y)), by = 1:nrow(df1)]

time1 <- Sys.time()
print(time1 - time0)
library(data.table)
library(plyr)
library(microbenchmark)

########################
## Test 1: data.table ##
########################

dt1 <- data.table(x = runif(1e4), y = runif(1e4))
dt2 <- data.table(x = runif(5e3), y = runif(5e3))

dist1 <- function(a, b){
                dt <- data.table((dt2$x-a)^2+(dt2$y-b)^2)
                return(which.min(dt$V1))}

results1 <- function() return(dt1[, j = list(Closest =  dist1(x, y)), by = 1:nrow(dt1)])

###################
## Test 2: adply ##
###################

df1 <- data.frame(x = runif(1e4), y = runif(1e4))
df2 <- data.frame(x = runif(5e3), y = runif(5e3))

dist2 <- function(df){
                dt <- data.table((df2$x-df$x)^2+(df2$y-df$y)^2)
                return(which.min(dt$V1))}

results2 <- function() return(adply(.data = df1, .margins = 1, .fun = dist2))

####################
## Test 3: sapply ##
####################

df1 <- data.frame(x = runif(1e4), y = runif(1e4))
df2 <- data.frame(x = runif(5e3), y = runif(5e3))

dist2 <- function(df){
                dt <- data.table((df2$x-df$x)^2+(df2$y-df$y)^2)
                return(which.min(dt$V1))}

results3 <- function() return(sapply(1:nrow(df1), function(x) return(dist2(df1[x,]))))

microbenchmark(results1(), results2(), results3(), times = 20)

#Unit: seconds
#       expr      min       lq     mean   median       uq      max neval
# results1() 4.046063 4.117177 4.401397 4.218234 4.538186 5.724824    20
# results2() 5.503518 5.679844 5.992497 5.886135 6.041192 7.283477    20
# results3() 4.718865 4.883286 5.131345 4.949300 5.231807 6.262914    20