Как контролировать количество шума, добавленного к пространственным точкам x, y в R?

Довольно начинающий пользователь R, и я уверен, что для этого есть простое решение, но я не могу его найти. У меня есть фрейм данных с рядом пространственных координат, а также множество других атрибутов. Многие пространственные координаты совпадают - и я хотел бы добавить к ним заданное количество шума, чтобы я мог удерживать их в определенном радиусе - в данном случае 0,4 метра или 40 сантиметров, одновременно отслеживая их связанные атрибуты.

По сути, я ищу R-версию этого вопроса: https://gis.stackexchange.com/questions/35479/adding-noise-to-overlapping-xy-coordinates-so-no-longer-in-exact-same-place

... потому что, когда я следую указаниям для ответа на этот вопрос с помощью ArcGIS, я получаю серию случайных точек, но теряю атрибуты, связанные с этими точками, и не могу легко найти способ сопоставить их с ними.

Есть ли способ использовать функцию дрожания в R или что-то подобное и указать радиус в пространственном контексте (например, 40 см), чтобы пространственные координаты случайным образом распределялись в этом диапазоне? Я не понимаю как манипулировать аргументом фактора и суммы, чтобы получить желаемый результат.

Редактировать:

Вот пример df с поддельными координатами. Как видите, координаты в первом и третьем столбцах совпадают, потому что животное дважды находилось под одним и тем же камнем. Я хотел бы иметь возможность добавить джиттер к этим координатам, чтобы они немного отличались, но я хочу контролировать джиттер в пределах 40 сантиметров (не больше, чем размер камня).

mydf <- data.frame("point_id" = 1:6, "date_time" = c("6/5/2018 10:57","6/5/2018 14:30","6/6/2018 10:06","6/6/2018 11:06","6/7/2018 10:35","6/7/2018 15:50"), "Animal_ID" = c(4,5,4,5,4,6), "Rock_ID" = c(1,2,1,3,4,5), x_proj = c(831120.3759,831441.0415,831120.3759,831433.4414,831128.4778,831422.0822), y_proj = c(5877582.998,5875337.074,5877582.998,5875328.897,5877575.360,5875338.216))

#make a separate object for the coordinates#
xy <- mydf[,c(5,6)]

#Convert to a spatialpoints data frame (insert own epsg)
sp.mydf <- SpatialPointsDataFrame(coords = xy, data = tumbling_test, proj4string = CRS("+init=epsg:xxxxx"))

Я хочу, чтобы мои вновь сгенерированные координаты по-прежнему содержали данные атрибутов из других столбцов (например, Animal_ID, дату и т. Д.), Потому что другие методы, которые я использовал в ArcGIS, генерируют серию новых случайных точек, но я не могу сопоставить их с атрибутами.

Также, если есть способ добавить джиттер только к точкам, которые имеют более одного вхождения на скале, это было бы аккуратно. Например, здесь мне нужно только добавить дрожание в строки 1 и 3, потому что другие координаты не повторяются. После добавления джиттера я хочу преобразовать результаты обратно в обычный фрейм данных, который я буду экспортировать в .csv


person Brewkeeper    schedule 12.01.2020    source источник
comment
Привет, @ Brad-Nissen, может быть, вы могли бы предоставить пример набора данных и указать, где именно вы столкнулись с проблемой?   -  person StupidWolf    schedule 12.01.2020
comment
@StupidWolf - Я даже не знал, с чего начать, но, судя по приведенному ниже ответу, я успешно расставил точки. Теперь мне просто нужно преобразовать результаты обратно в нормальный формат фрейма данных, чтобы я мог его экспортировать. Тем не менее, я могу попробовать отредактировать вопрос, чтобы описать мой образец данных.   -  person Brewkeeper    schedule 13.01.2020


Ответы (1)


Есть, и это намного проще, если вы работаете с sf-объектом.

Вам нужно будет немного покопаться в системах координат (CRS), чтобы смещать точки на правильное расстояние.

Если вы начинаете с пространственного кадра данных, используйте st_as_sf(), чтобы вернуть объект sf.

Ниже приведен воспроизводимый пример с точками, колеблющимися около 5 км. Дрожание несколько случайное и в этом примере колеблется в пределах ~ 2-5,5 километров.

library(sf)
#> Linking to GEOS 3.6.2, GDAL 2.2.3, PROJ 4.9.3
library(tidyverse)

# load example data
nc <- read_sf(system.file('gpkg/nc.gpkg', package = 'sf'))

#make single points from polygons
nc_points <- st_centroid(nc)
#> Warning in st_centroid.sf(nc): st_centroid assumes attributes are constant over
#> geometries of x
#> Warning in st_centroid.sfc(st_geometry(x), of_largest_polygon =
#> of_largest_polygon): st_centroid does not give correct centroids for longitude/
#> latitude data

# Transform to a crs that uses meters as the distance
nc_points <- st_transform(nc_points, 3358)

nc_points_jittered <- st_jitter(nc_points, amount = 5000)

p1 <- ggplot(nc_points) + 
  geom_sf() + 
  ggtitle('Original')

p2 <- ggplot(nc_points_jittered) + 
  geom_sf() + 
  ggtitle('Jittered')

p3 <- ggplot() + 
  geom_sf(data = nc_points, color = 'red') + 
  geom_sf(data = nc_points_jittered, color = 'black') + 
  ggtitle('Both')

cowplot::plot_grid(p1, p2, p3, ncol = 1)

Создано 12 января 2020 г. пакетом REPEX (v0.3.0)

person mrhellmann    schedule 12.01.2020
comment
Это прекрасно сработало. Как мне затем преобразовать полученный столбец с дрожащими точками обратно в обычные столбцы в фрейме данных? Сейчас у него геометрия заголовка, и каждая ячейка имеет вид: c (731020.531373004, 3877583.35181795) - person Brewkeeper; 13.01.2020
comment
Также интересно, почему джиттер больше установленного значения? Вы говорите, что он варьируется до 5,5 км, есть ли способ установить предел джиттера, чтобы он не превышал его величину? Как вы узнали, сколько в данном случае она варьируется? - person Brewkeeper; 13.01.2020
comment
@Brewkeeper преобразовать обратно в координаты с помощью st_coordinates(), проверить файл справки, и это может помочь преобразовать обратно в координаты широты и долготы. Пространственные данные становятся немного странными. Lat & lon недостаточно для многих операций. Джиттер - это своего рода по определению «некоторая величина около этого числа в любом направлении». Код для sf jitter находится здесь: github.com/r- пространственный / sf / blob / master / R / jitter.R Как далеко бегут эти саламандры? - person mrhellmann; 13.01.2020
comment
Спасибо! Да, я преобразовал данные в координаты UTM, прежде чем выполнять джиттер, но я просмотрю файл справки и при необходимости конвертирую. Эти саламандры - маги ада, поэтому они могут делать большие движения, если хотят (сотни метров, если они наклонены), но большую часть времени мы находим их под одними и теми же скалами снова и снова, отсюда и потребность в некотором дрожании. Как вы догадались, что я выслеживаю саламандр? ха-ха - person Brewkeeper; 13.01.2020