1 votos

Extracción de datos categoriales de polígonos vecinos a partir de st_intersects

Para cada polígono de un sf objeto, necesito extraer los datos de una sola variable de todos los polígonos vecinos. He hecho un reprex abajo.

Hasta ahora he conseguido obtener una lista de los polígonos vecinos utilizando st_intersects ,

demo(nc, ask = FALSE, verbose = FALSE)

nc <- nc %>% 
  mutate(polygon_id = row_number())

neighbors <- st_intersects(nc, nc)

Por ejemplo, el polígono 5 (condado de Northampton) tiene los siguientes vecinos:

neighbors[[5]]
[1]  5  6  9 16 28

Necesito el nombre de cada uno de estos vecinos (y hacer esto para cada polígono)

names(nc)
 [1] "AREA"       "PERIMETER"  "CNTY_"      "CNTY_ID"    "NAME"       "FIPS"       "FIPSNO"     "CRESS_ID"   "BIR74"      "SID74"      "NWBIR74"    "BIR79"     
[13] "SID79"      "NWBIR79"    "geom"       "polygon_id"

nc[c(6,9,16,28),5]
       NAME                           geom
6  Hertford MULTIPOLYGON (((-76.74506 3...
9    Warren MULTIPOLYGON (((-78.30876 3...
16  Halifax MULTIPOLYGON (((-77.33221 3...
28   Bertie MULTIPOLYGON (((-76.78307 3...

Estoy luchando por hacer dos cosas:

  1. Eliminar "la diagonal", es decir, el propio polígono (aquí, el polígono 5) de su lista de vecinos
  2. Extraer los nombres de todos sus vecinos (condados de Hertford, Warren, Halifax y Bertie) en N vectores de caracteres, ya que el número de vecinos varía. Como alternativa, puedo conformarme con pegarlos en un único vector de caracteres separados por algo que me permita dividirlos después.

2voto

Jay Bazuzi Puntos 194

Esta es una tarea común de procesamiento de listas: trate su objeto de vecindad como una lista y utilice lapply así para obtener el NAME elementos de los vectores correspondientes en neighbors :

> namesof = lapply(neighbors, function(n){nc$NAME[n]})

dando:

> namesof[[1]]
[1] Ashe      Alleghany Wilkes    Watauga  
100 Levels: Alamance Alexander Alleghany Anson Ashe Avery Beaufort ... Yancey
> namesof[[2]]
[1] Ashe      Alleghany Surry     Wilkes   
100 Levels: Alamance Alexander Alleghany Anson Ashe Avery Beaufort ... Yancey

También puede utilizar Map para obtener el resultado de una función sobre una lista de elementos, prácticamente lo mismo que lapply :

> namesof = Map(function(n){nc$NAME[n]}, neighbors)
> namesof[[1]]
[1] Ashe      Alleghany Wilkes    Watauga  
100 Levels: Alamance Alexander Alleghany Anson Ashe Avery Beaufort ... Yancey
> namesof[[2]]
[1] Ashe      Alleghany Surry     Wilkes   
100 Levels: Alamance Alexander Alleghany Anson Ashe Avery Beaufort ... Yancey

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X