我是R的新手并尝试遍历df1的每一行并搜索df2中距离很近的行(5mi / 8046.72m)。我认为df1按预期循环,但我不认为它是通过所有df2。
{for (i in 1:1452){
p1 <- df1[i, 4:5]
p2 <- df2[1:11, 2:3]
d <- distCosine(p1, p2, r=6378137)
return(d< 8046.72)
i <- i+1}
}
我得到了输出:
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
答案 0 :(得分:1)
我只想使用apply
函数。首先,让我们通过创建一些“虚假”数据来使你的问题重现 - 我正在使人工关闭lon / lat对,这样我们就可以在结果中得到一些TRUE
:
library(geosphere)
df1 <- data.frame(X1 = sample(letters, 100, replace = T),
x2 = sample(letters, 100, replace = T),
x3 = sample(letters, 100, replace = T),
lon = sample(10:12 + rnorm(100, 0, 0.1), 100, replace = T),
lat = sample(10:12 + rnorm(100, 0, 0.1), replace = T))
df2 <- data.frame(x1 = sample(letters, 100, replace = T),
lon = sample(10:12 + rnorm(100, 0, 0.1), 100, replace = T),
lat = sample(10:12 + rnorm(100, 0, 0.1), 100, replace = T))
然后我们可以创建两个包含感兴趣的值的矩阵:
m1 <- as.matrix(df1[, c("lon", "lat")])
m2 <- as.matrix(df2[1:11, c("lon", "lat")])
现在,我们可以在apply
行中使用m2
函数返回100 X 11
矩阵:
results <- apply(m2, 1, FUN = function(x) distCosine(x, m1))
为了获得不到5英里(约8046.72米)的结果,我们只需将其分组:
results[results < 8046.72]
# Showing the next two for alternative output
which(results < 8046.72)
which(results < 8046.72, arr.ind = T)
注意:在您的问题中,看起来您对前1,452行感兴趣 - 这意味着结果将是1,452 X 11
矩阵。