Crear datos espaciales en R

Tengo un conjunto de datos de especies y sus ubicaciones aproximadas en un área de 100 x 200 metros. La parte de ubicación del marco de datos no está en un formato que me parezca utilizable. En este rectángulo de 100 x 200 metros, hay doscientos cuadrados de 10 x 10 metros llamados A a CV. Dentro de cada cuadrado de 10 x 10 hay cuatro cuadrados de 5 x 5 metros llamados 1, 2, 3 y 4, respectivamente (1 está al sur de 2 y al oeste de 3. 4 está al este de 2 y al norte de 3). Quiero que R sepa que A es el cuadrado con esquinas en (0), (0), (10,0) y (0,0), que B está justo al norte de A y tiene esquinas ( 0,10), (0,10), (0,20) y (10,10), y K está justo al este de A y tiene esquinas en (10,20), (10,0), (10,10, 20,0), y (20,10), y así sucesivamente para todos los cuadrados de 10 x 10 metros. Además, quiero que R sepa dónde está cada cuadrado de 5 x 5 metros en la parcela de 100 x 200 metros.

Entonces, mi marco de datos se parece a esto

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

Eventualmente, quiero poder trazar el área de 100 x 200 metros y que cada cuadrado de 10 x 10 metros aparezca con la cantidad de árboles, la cantidad de especies o la biomasa total. ¿Cuál es la mejor manera de convertir los datos que tengo? en datos espaciales que R puede usar para graficar y tal vez analizar?

preguntado el 24 de agosto de 12 a las 22:08

por cierto, estoy un poco confundido acerca de la geometría de tu área. Tiene 100 parcelas de 10x10 (A a CV), aparentemente dispuestas en filas de 10, ¿no es eso un área de 100x100 en lugar de 100x200? (También se refiere a él como un "cuadrado" en un punto arriba ...) -

Estoy escribiendo en un teléfono, lo siento. Está arreglado ahora. Ahora estoy trabajando para adaptar el código a mis datos reales, ya que esto era un poco una abstracción. Muchísimas gracias por la ayuda. Esta es una manera inteligente de llegar al problema. -

2 Respuestas

He aquí un comienzo.

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

Una función para convertir (por ejemplo) {"J",3} al centro del subcuadrado correspondiente.

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)
}

uso:

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

Notas importantes:

  • esta es una prueba de concepto, puedo garantizar que no tengo la correspondencia de las coordenadas x e y del todo bien. Pero debería poder rastrear esto línea por línea y ver lo que está haciendo...
  • debería funcionar correctamente en vectores (consulte el segundo ejemplo de uso anterior): cambié de switch a ifelse por esta razón
  • sus nombres de columna (10x10) es probable que se destrocen en algo como X10.10 al leer datos en R: ver ?data.frame y ?check.names

Respondido 24 ago 12, 23:08

Perfecto. Maneja vectores y entradas muy bien. Para obtener 2 vectores, uno de coordenadas x y uno de coordenadas y puedes escribir x.coords <- convpos(pos10, pos5)[1:(length(pos10)/2)] y y.coords <- convpos(pos10, pos5)[(1 + length (pos10)/2: length (pos10)]. - Jota

Similar a lo que ha hecho @Ben Bolker, aquí hay una función de búsqueda (aunque es posible que deba transponer algo para que las etiquetas coincidan con lo que describe).

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

Si esto no es lo que está buscando, entonces tal vez prefiera una SpatialPolygonsDataFrame, que tiene ID de polígono adecuados, y adjunta datos, etc. En ese caso, simplemente busque en Google cómo hacer uno desde cero y manipule el row() y col() funciones para obtener las esquinas de su polígono, similar a lo que se proporciona en esta función de búsqueda, que solo devuelve centroides.

Editar: iniciar SPDF:

Esto se modifica del ejemplo de la función y, con suerte, puede ser un buen comienzo:

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)))

Respondido 25 ago 12, 00:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.