我有一个包含数十万行 GPS 坐标和相关变量的数据集。来自源的 GPS 坐标位于给定城市街区的中心,而不是位于特定地址。我需要将这些坐标抖动最多二分之一长的块,以将所有点分布在块中,以便以后更轻松地进行数据可视化。
下面包含代码和可重现的示例。
# Code for StackOverflow question
# Required package[s]
require(tidyverse)
# Generate minimal reproducible example
centerlong <- c(-90.28192, -90.28192, -90.28192, -90.28192, -90.28192,
-90.31374, -90.31374, -91.51432, -92.12345, -93.12345)
centerlat <- c(44.12345, 44.12345, 44.12345, 44.28567, 44.28567,
43.98243, 43.98243, 45.00249, 42.12345, 41.12345)
df <- data.frame(centerlong, centerlat)
# Jitter GPS coordinates by 1/2 long block
df <- df %>%
mutate(Longitude = runif(1)*((centerlong+0.0005)-(centerlong-0.0005))+(centerlong-0.0005)) %>%
mutate(Latitude = runif(1)*((centerlat+0.0005)-(centerlat-0.0005))+(centerlat-0.0005))
我的问题是,使用上面的代码,它获取所有相同的 GPS 坐标并将它们全部抖动到完全相同的新值,而不是单独抖动每一行。
我所看到的: |中心长|经度 | | -------- | -------- | | -90.28192 | -90.28192 -90.28196 | -90.28196 | -90.28192 | -90.28192 -90.28196 | -90.28196 | -90.28192 | -90.28192 -90.28196 | -90.28196 |
[...]
| [...]
|
我想看到的: |中心长|经度 | | -------- | -------- | | -90.28192 | -90.28192 -90.28080 | | -90.28192 | -90.28192 -90.28142 | -90.28142 | -90.28192 | -90.28192 -90.28105 | -90.28105 |
[...]
| [...]
|
我也尝试过在不使用 mutate 的情况下生成这些值:
df$Longitude <- runif(1)*((df$centerlong+0.0005)-(df$centerlong-0.0005))+(df$centerlong-0.0005)
我不知道如何纠正这种行为。看起来
runif()
只是为整个 df
生成单个数字,而不是为 df
中的每一行生成新数字。我知道我错过了一些简单的东西,但我现在已经在互联网上挖掘了几个小时,但没有取得多大成功。
我建议将抖动距离设置为一个变量,这样可以降低拼写错误的风险,并且如果您想尝试不同的距离,也可以轻松更改它。然后你可以做这样的事情:
j = 0.0005
df <- df %>%
mutate(
Longitude = centerlong + runif(n(), min = -j, max = j)
Latitude = centerlat + runif(n(), min = -j, max = j)
)