【问题标题】:Moving spatial data off gird cell corners将空间数据移出网格单元角
【发布时间】:2021-12-13 07:01:37
【问题描述】:

我有一个看似简单的问题,但我似乎无法弄清楚。我有一个包含数百万个数据点的大型数据集。每个数据点代表一条鱼及其生物信息以及捕获时间和地点。我正在对这些数据进行一些统计,并且遇到了一些问题,我最终找到了一些数据点,这些数据点的纬度和经度值正好落在我用来存储数据的网格单元的角上。当这些具有 lats 和 long 且恰好落在网格单元角上的鱼被分组到它们相应的网格单元中时,它们最终会被复制 4 次(每个单元格与网格单元角接触它们的 lats 和 long 标识)。

不用说这很糟糕,我需要强迫这些动物有纬度和经度,不要将它们完全放在网格单元角上。我意识到可能有很多方法可以纠正这样的事情,但我真正需要的是一种简单的方法来识别具有整数值的纬度和经度,然后将它们修改为非常少量(随机添加或减去),例如以相同的方式将它们转移到特定的单元格中而不会产生偏差。

我希望这个解释是有道理的。为了提供一个可行的问题,我提供了一个非常简单的示例。

fish <- data.frame(fish=1:10, lat=c(25,25,25,25.01,25.2,25.1,25.5,25.7,25,25), 
                   long=c(140,140,140,140.23,140.01,140.44,140.2,140.05,140,140))

在这个鱼数据框中有 10 条鱼,每条鱼都有一个相关的纬度和经度。鱼 1、2、3、9 和 10 具有整数 lat 和 long 值,它们将准确地放置在我的网格单元的角上。我需要一些方法来将这些值改变为正负 0.01 之类的值。

我可以通过以下方式轻松识别哪些纬度或经度是整数:

fish %>%
  near(as.integer(fish$lat))

但我正在努力寻找一种方法,然后将所有整数值修改少量。

【问题讨论】:

  • 数鱼4次的代码是什么?似乎问题在于它使用的是封闭间隔而不是开放间隔。解决该问题可能比弄乱您的数据更好。真正导致问题的代码是什么?
  • 在处理这些数据的很久以后,在我将所有数据转换为一个 sf 对象并创建了一个跨越太平洋的网格系统之后,我使用:st_join() 来确定哪些点在哪些细胞。有一次我正在使用 st_intersection() 但现在这样做有问题。就像我说的那样,可能有很多解决方案,但是将数据更改一小部分是一个简单的解决方案。此外,具有整数值 lat 和 long 的数据不是真实数据,它们是出于保密原因以这种方式呈现的其他国家数据集的平均点。

标签: r dataframe random tidyverse spatial


【解决方案1】:

为了回答我自己的问题,我今天早上用一些非常基本的代码解决了这个问题,见下文。所需要的只是创建一个实际查找整数的函数,而 is.integer 不会。

# Used to fix the is.integer function to actually work and not just look at syntax
is.wholenumber <- function(x, tol = .Machine$double.eps^0.5)  abs(x - round(x)) < tol

# Use ifelse to change only whole number values of lat and long
fish$jitter_lat <- ifelse(is.wholenumber(fish$lat), fish$lat+rnorm(fish$lat, mean=0, sd=0.01), fish$lat)

fish$jitter_long <- ifelse(is.wholenumber(fish$long), fish$long+rnorm(fish$long, mean=0, sd=0.01), fish$long)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多