为数据框中的每一行为另一个数据框中的每一行应用一个函数
Apply a function for every row in a dataframe for every row in another dataframe
我有两个数据帧,"a" 和 "b"。他们都有 gps 数据,但是 "a" 有 1000 行,"b" 有 5 行。我正在用半正弦公式比较距离,但我想应用该函数,以便将 "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
我有两个数据帧,"a" 和 "b"。他们都有 gps 数据,但是 "a" 有 1000 行,"b" 有 5 行。我正在用半正弦公式比较距离,但我想应用该函数,以便将 "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