Создание пространственных данных в R


У меня есть набор данных видов и их приблизительное расположение на площади 100 х 200 метров. Расположение части фрейма данных не в том формате, который я считаю пригодным для использования. В этом прямоугольнике размером 100 х 200 метров есть двести квадратов размером 10 х 10 метров, названных a через CV. В пределах каждого квадрата размером 10 х 10 есть четыре квадрата размером 5 х 5 метров, названные соответственно 1, 2, 3 и 4 (1 находится к югу от 2 и к западу от 3. 4 находится к востоку от 2 и к северу от 3). Я хочу, чтобы R знал, что A-это квадрат с углами в (0 ,0), (10,0), (0,0), и (0,10), что B находится к северу от A и имеет углы (0,10), (0,20), (10,10), и (10,20), А K находится к востоку от A и имеет углы в (10,0), (10,10), (20,0), и (20,10), и так далее для всех квадратов размером 10 х 10 метров. Кроме того, я хочу, чтобы R знал, где находится каждый квадрат размером 5 х 5 метров на участке размером 100 х 200 метров.

Итак, мой фрейм данных выглядит примерно так

10x10    5x5     Tree    Diameter
A    1     tree1    4
B    1     tree2    4
C    4     tree3    6
D    3     tree4    2
E    3     tree5    3
F    2     tree6    7
G    1     tree7    12
H    2     tree8    1
I    2     tree9    2
J    3     tree10   8
K    4     tree11   3
L    1     tree12   7
M    2     tree13   5

В конце концов, я хочу иметь возможность построить площадь 100 х 200 метров и иметь каждый 10 х 10 квадрат метра показывают с количеством деревьев, или количеством видов, или общей биомассой Как лучше всего превратить имеющиеся у меня данные в пространственные данные, которые R может использовать для построения графиков и, возможно, анализа?

2 3

2 ответа:

Вот для начала.

## set up a vector of all 10x10 position tags
tags10 <- c(LETTERS,
            paste0("A",LETTERS),
            paste0("B",LETTERS),
            paste0("C",LETTERS[1:22]))

Функция для преобразования (например) {"J",3} в центр соответствующего субквадрата.

convpos <- function(pos10,pos5) {
    ## convert letters to major (x,y) positions
    p1 <- as.numeric(factor(pos10,levels=tags10))  ## or use match()
    p1.x <- ((p1-1) %% 10) *10+5    ## %% is modulo operator
    p1.y <- ((p1-1) %/% 10)*10+5    ## %/% is integer division
    ## sort out sub-positions
    p2.x <- ifelse(pos5 <=2,2.5,7.5)   ## {1,2} vs {3,4} values
    p2.y <- ifelse(pos5 %%2 ==1 ,2.5,7.5)  ## odd {1,3} vs even {2,4} values
    c(p1.x+p2.x,p1.y+p2.y)
}

Использование:

convpos("J",2)
convpos(mydata$tenbytenpos,mydata$fivebyfivepos)

Важные Примечания:

    Это доказательство концепции, я могу в значительной степени гарантировать, что я не получил соответствие координат x и y совершенно правильно. Но вы должны быть в состоянии проследить через эту линию за линией и увидеть, что она делает ...
  • он должен корректно работать на векторах (см. Второй пример использования выше): я переключился с switch на ifelse по этой причине
  • ваши имена столбцов (10x10), вероятно, будут искажены в нечто вроде X10.10 при чтении данных в R: см. ?data.frame и ?check.names

Аналогично тому, что сделал @Ben Bolker, вот функция поиска (хотя вам может потребоваться что-то транспонировать, чтобы метки соответствовали тому, что вы описываете).

tenbyten <- c(LETTERS[1:26], 
  paste0("A",LETTERS[1:26]), 
  paste0("B",LETTERS[1:26]), 
  paste0("C",LETTERS[1:22]))

tenbyten <- matrix(rep(tenbyten, each = 2), ncol = 10)
tenbyten <- t(apply(tenbyten, 1, function(x){rep(x, each = 2)}))
# the 1234 squares
squares <- matrix(c(rep(c(1,2),10),rep(c(4,3),10)), nrow = 20, ncol = 20)
# stick together into a reference grid
my.grid <- matrix(paste(tenbyten, squares, sep = "-"), nrow = 20, ncol = 20)

# a lookup function for the site grid
coordLookup <- function(tbt, fbf, .my.grid = my.grid){
  x <- col(.my.grid) * 5 - 2.5
  y <- row(.my.grid) * 5 - 2.5
  marker <- .my.grid == paste(tbt, fbf, sep = "-")
  list(x = x[marker], y = y[marker])
}

coordLookup("BB",2)
$x
[1] 52.5

$y
[1] 37.5

Если это не то, что вы ищете, то, возможно, вы предпочтете SpatialPolygonsDataFrame, который имеет правильные идентификаторы полигонов, и вы прикрепляете данные К и т. д. В этом случае просто погуглите вокруг, чтобы узнать, как сделать его с нуля, и манипулируйте функциями row() и col(), чтобы получить ваши углы многоугольника, подобные тому, что дано в этой функции поиска, который возвращает только центроиды.

Edit: начало работы SPDF:

Это модифицировано из примера функции и, надеюсь, может быть хорошим началом:

library(sp)
# really you have a 20x20 grid, counting the small ones.
# c(2.5,2.5) specifies the distance in any direction from the cell center
grd <- GridTopology(c(1,1), c(2.5,2.5), c(20,20)))
grd <- as.SpatialPolygons.GridTopology(grd)
# get centroids
coords <- coordinates(polys)
# make SPDF, with an extra column for your grid codes, taken from the above.
# you can add further columns to this data.frame(), using polys@data
polys <- SpatialPolygonsDataFrame(grd, 
  data=data.frame(x=coords[,1], y=coords[,2], my.ID = as.vector(my.grid), 
  row.names=getSpPPolygonsIDSlots(grd)))