R 中数据帧中的随机抖动 GPS 坐标

问题描述 投票:0回答:1

我有一个包含数十万行 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
中的每一行生成新数字。我知道我错过了一些简单的东西,但我现在已经在互联网上挖掘了几个小时,但没有取得多大成功。

r random gps
1个回答
0
投票

我建议将抖动距离设置为一个变量,这样可以降低拼写错误的风险,并且如果您想尝试不同的距离,也可以轻松更改它。然后你可以做这样的事情:

j = 0.0005
df <- df %>% 
  mutate(
    Longitude = centerlong + runif(n(), min = -j, max = j) 
    Latitude  = centerlat  + runif(n(), min = -j, max = j) 
  )
© www.soinside.com 2019 - 2024. All rights reserved.