为数据框中的每一行应用一个函数,用于另一个数据框中的每一行
Posted
技术标签:
【中文标题】为数据框中的每一行应用一个函数,用于另一个数据框中的每一行【英文标题】:Apply a function for every row in a dataframe for every row in another dataframe 【发布时间】:2017-07-13 12:39:34 【问题描述】:我有两个数据框,“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)
【问题讨论】:
你能分享你的数据集吗?试试dput(a)
和dput(b)
。
去through this link
数据集中的信息很敏感,但我认为它并不重要。 distHaversine() 函数工作正常,我只需要知道如何循环它,以便它将“a”的每一行应用于“b”的每一行
您是否只是忘记了 for 循环中的 i
? a[i,c(11,9)], b[i,c(4,2)]
你说得对,Jakob Gepp,我确实(愚蠢地)忘记了那部分。
【参考方案1】:
可能类似于以下内容。
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
【讨论】:
这很好用,我得到一个矩阵,每行“a”有一行,每行“b”有一个列,计算每行之间的距离。【参考方案2】:这可能是您的解决方案:
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
【讨论】:
以上是关于为数据框中的每一行应用一个函数,用于另一个数据框中的每一行的主要内容,如果未能解决你的问题,请参考以下文章