繁体   English   中英

为数据框中的每一行对另一个数据框中的每一行应用函数

[英]Apply a function for every row in a dataframe for every row in another dataframe

我有两个数据框,“ a”和“ b”。 它们都具有gps数据,但是“ a”具有1000行,而“ b”具有5行。 我正在使用Haversine公式比较距离,但是我想应用该函数,以便将“ a”的每一行与“ b”的每一行进行比较。 我应该最终得到5000个结果。

这是我到目前为止的结果,但是只给了我1000个结果:

library(geosphere)

for(i in 1:nrow(a)){
  distHaversine(a[,c(11,9)],b[,c(4,2)])
}

在此先感谢您的协助。

编辑

我发现了一个更好的解决方案,可以减少代码和计算时间:

library(geosphere)

result <- distm(a[ , c(11, 9)], b[ , c(4, 2)], fun = distHaversine)

也许像下面这样。

result <- matrix(numeric(nrow(a)*nrow(b)), ncol = nrow(b))

for(i in seq_len(nrow(a))){
    for(j in seq_len(nrow(b))){
        result[i, j] <- distHaversine(a[i, c(11, 9)],b[j, c(4, 2)])
    }
}

result

这可能是您的解决方案:

indx <- expand.grid(a=1:1000,b=1:5)

res <- apply(indx,1,function(x) distHaversine(a[x[1],],b[x[2],]))

使用expand.grid我将两个data.frames的所有行索引组合在一起,然后将它们用于apply函数中的索引。

要追溯计算出的距离,可以将结果作为一列添加到索引中。

> head(cbind(indx,res))
  a b      res
1 1 1 12318145
2 2 1  5528108
3 3 1 11090739
4 4 1 14962267
5 5 1 19480911
6 6 1  8936878

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM