Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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_Loops_For Loop_Euclidean Distance - Fatal编程技术网

R 计算数据帧中每一行与另一数据帧中所有其他行之间的欧氏距离

R 计算数据帧中每一行与另一数据帧中所有其他行之间的欧氏距离,r,loops,for-loop,euclidean-distance,R,Loops,For Loop,Euclidean Distance,我需要生成一个数据帧,在一个数据帧的每一行和另一个数据帧的所有其他行之间具有最小的欧几里德距离。我的两个数据帧都很大(大约40000行)。这是我到目前为止可以解决的问题 x<-matrix(c(3,6,3,4,8),nrow=5,ncol=7,byrow = TRUE) y<-matrix(c(1,4,4,1,9),nrow=5,ncol=7,byrow = TRUE) sed.dist<-numeric(5) for (i in 1:(length(sed.di

我需要生成一个数据帧,在一个数据帧的每一行和另一个数据帧的所有其他行之间具有最小的欧几里德距离。我的两个数据帧都很大(大约40000行)。这是我到目前为止可以解决的问题

x<-matrix(c(3,6,3,4,8),nrow=5,ncol=7,byrow = TRUE)     
y<-matrix(c(1,4,4,1,9),nrow=5,ncol=7,byrow = TRUE)


sed.dist<-numeric(5)
for (i in 1:(length(sed.dist))) {
sed.dist[i]<-(sqrt(sum((y[i,1:7] - x[i,1:7])^2)))
}
x试试这个:

apply(y,1,function(y) min(apply(x,1,function(x,y)dist(rbind(x,y)),y)))
# [1] 5.196152 5.385165 4.898979 4.898979 5.385165

从内到外,我们将一行x绑定到一行y,并使用
dist(…)
函数(用C编写)计算它们之间的距离。我们使用内部的
apply(…)
,依次对给定的y行和x行执行此操作,然后找到结果的最小值。然后我们对
apply(…)

的外部调用中的每一行y都执行此操作。扩展我对该问题的评论,一个非常快速的方法将是如下所示,尽管对于40000行,我想您需要等待一段时间:

unlist(lapply(seq_len(nrow(y)), function(i) min(sqrt(colSums((y[i, ] - t(x))^2)))))
#[1] 5.196152 5.385165 4.898979 4.898979 5.385165
以及比较基准:

x = matrix(runif(1e2*5), 1e2)
y = matrix(runif(1e2*5), 1e2)
library(microbenchmark)
alex = function() unlist(lapply(seq_len(nrow(y)), 
                           function(i) min(sqrt(colSums((y[i, ] - t(x))^2)))))
jlhoward = function() apply(y,1,function(y)
                                  min(apply(x,1,function(x,y)dist(rbind(x,y)),y)))
all.equal(alex(), jlhoward())
#[1] TRUE
microbenchmark(alex(), jlhoward(), times = 20)
#Unit: milliseconds
#       expr        min         lq     median         uq        max neval
#     alex()   3.369188   3.479011   3.600354   4.513114   4.789592    20
# jlhoward() 422.198621 431.565643 436.561057 442.643181 602.929742    20

sqrt(colSums((y[1,]-t(x))^2))
计算
y
中第1行与
x
中所有行的距离。你想要这个的
min
,并且在
y
中每隔一行重复一次吗?是的,这就是我想要的非常感谢你……它工作得非常好,但运行了很长时间……不过谢谢你的帮助。