Wie kann ich mit fortify () einen gefilterten R-Datenrahmen aus einem Shapefile erstellen?

11

Ich bin gerade dabei, eine ggplotChoroplethenkarte der Bevölkerung in Verwaltungsgebieten in Wales zu erstellen. Ich habe die Boundary-Line-Daten aus der Ordnance Survey heruntergeladen und das scheinbar richtige Shapefile (community_ward_region.shp) extrahiert. Mit R bin ich so weit gekommen, das Shapefile zu lesen.

require(maptools)
shape <- readShapePoly(wards)
str(shape)

Was mir diese vielversprechende Ausgabe gibt:

Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
  ..@ data       :'data.frame': 1690 obs. of  4 variables:
  .. ..$ NAME      : Factor w/ 1507 levels "Abbey Cwmhir",..: 969 90 111 200 441 477 1455 249 255 305 ...
  .. ..$ DESCRIPTIO: Factor w/ 4 levels "COMMUNITY","COMMUNITY WARD",..: 2 2 1 1 2 2 2 2 1 1 ...
  .. ..$ COMMUNITY : Factor w/ 858 levels "Abbey Cwmhir",..: 67 67 81 128 152 152 152 152 157 190 ...
  .. ..$ FILE_NAME : Factor w/ 23 levels "ABERTAWE_-_SWANSEA",..: 1 1 1 1 1 1 1 1 1 1 ...
  .. ..- attr(*, "data_types")= chr [1:4] "C" "C" "C" "C"
  ..@ polygons   :List of 1690
  .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
  .. .. .. ..@ Polygons :List of 1
  .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
  .. .. .. .. .. .. ..@ labpt  : num [1:2] 259009 188524
  .. .. .. .. .. .. ..@ area   : num 1923892
  .. .. .. .. .. .. ..@ hole   : logi FALSE
  .. .. .. .. .. .. ..@ ringDir: int 1
  .. .. .. .. .. .. ..@ coords : num [1:1629, 1:2] 259413 259420 259427 259427 259432 ...
  .. .. .. ..@ plotOrder: int 1
  .. .. .. ..@ labpt    : num [1:2] 259009 188524
  .. .. .. ..@ ID       : chr "0"
  .. .. .. ..@ area     : num 1923892

Wenn ich das jetzt mache:

bar <- fortify(shape, region = "NAME")

Ich bekomme einen schönen Datenrahmen namens bar, der so aussieht, wie ich es erwartet hatte:

> str(bar)
'data.frame':   4744053 obs. of  7 variables:
 $ long : num  302962 302970 302974 303013 303015 ...
 $ lat  : num  280066 280076 280078 280097 280105 ...
 $ order: int  1 2 3 4 5 6 7 8 9 10 ...
 $ hole : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ piece: Factor w/ 29 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ group: Factor w/ 1762 levels "Abbey Cwmhir.1",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ id   : chr  "Abbey Cwmhir" "Abbey Cwmhir" "Abbey Cwmhir" "Abbey Cwmhir" ..

Dies ist jedoch ein großer ggplotDatenrahmen, dem beim Versuch, ihn anzuzeigen, der Puff ausgeht. In Wirklichkeit möchte ich immer nur einen Bereich betrachten. Es sieht so aus, als ob der FILE_NAMEFaktor im Formobjekt das ist, was ich will, da er hauptsächlich den Landkreisen und den großen Ballungsräumen entspricht.

> unique(shape@data$FILE_NAME)
 [1] ABERTAWE_-_SWANSEA
 [2] BLAENAU_GWENT_-_BLAENAU_GWENT
 [3] BRO_MORGANNWG_-_THE_VALE_OF_GLAMORGAN
 [4] CAERDYDD_-_CARDIFF
 [5] CAERFFILI_-_CAERPHILLY
 [6] CASNEWYDD_-_NEWPORT
 [7] CASTELL-NEDD_PORT_TALBOT_-_NEATH_PORT_TALBOT
 [8] CONWY_-_CONWY
 [9] GWYNEDD_-_GWYNEDD
[10] MERTHYR_TUDFUL_-_MERTHYR_TYDFIL
[11] PEN-Y-BONT_AR_OGWR_-_BRIDGEND
[12] POWYS_-_POWYS
[13] RHONDDA_CYNON_TAF_-_RHONDDA_CYNON_TAFF
[14] SIR BENFRO - PEMBROKESHIRE
[15] SIR_BENFRO_-_PEMBROKESHIRE
[16] SIR_CEREDIGION_-_CEREDIGION
[17] SIR_DDINBYCH_-_DENBIGHSHIRE
[18] SIR_FYNWY_-_MONMOUTHSHIRE
[19] SIR_GAERFYRDDIN_-_CARMARTHENSHIRE
[20] SIR_YNYS_MON_-_ISLE_OF_ANGLESEY
[21] SIR_Y_FFLINT_-_FLINTSHIRE
[22] TOR-FAEN_-_TORFAEN
[23] WRECSAM_-_WREXHAM
23 Levels: ABERTAWE_-_SWANSEA ... WRECSAM_-_WREXHAM

Frage: Wie kann ich nur eine Teilmenge der Daten aus dem shapeObjekt auswählen, das ich aus dem Shapefile extrahiere? Zum Beispiel nur die POWYS_-_POWYSTeile? Wenn ich das irgendwie FILE_NAMEin den Datenrahmen aufnehmen kann, mit dem erstellt wird, fortifykönnte ich den Datenrahmen leicht unterteilen bar, aber ich weiß nicht, wie ich das machen soll. Oder gibt es eine Möglichkeit, fortifynur Teile des Objekts zu extrahieren?

Langsamer Lerner
quelle

Antworten:

5

Wählen Sie mithilfe der Indizierung eine Teilmenge der Shapefile-Daten aus:

sub.shape <- shape[shape$FILE_NAME == "POWYS_-_POWYS",]

fortify(sub.shape) Sie erhalten dann einen stark reduzierten Datenrahmen.

Simbamangu
quelle
Vielen Dank, jetzt zu überprüfen, sieht vielversprechend aus. Sollte das dort am Ende vielleicht ein ",]" sein?
SlowLearner
1
@ Slowlearner - Whoops, ja, fehlendes Komma, mein ewiger Fehler ...
Simbamangu