循环通过2个数据帧

时间:2016-02-23 15:42:11

标签: r loops

我是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

1 个答案:

答案 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矩阵。