Comment puis-je utiliser fortify () pour créer une trame de données R filtrée à partir d'un fichier de formes?

11

Je suis en train de construire une ggplotcarte choroplèthe de la population dans les zones administratives du Pays de Galles. J'ai téléchargé les données sur les limites de l'Ordnance Survey et extrait ce qui semble être le bon fichier de formes (community_ward_region.shp). En utilisant R, je suis allé jusqu'à lire dans le fichier de formes.

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

Ce qui me donne cette sortie prometteuse:

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

Maintenant, si je fais cela:

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

Je reçois un joli cadre de données appelé barqui ressemble à peu près à ce que j'attendais:

> 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" ..

Cependant, il s'agit d'un bloc de données volumineux et à ggplotcourt de bouffées lors de la tentative d'affichage. En réalité, je veux seulement regarder un domaine à la fois. Il semble que le FILE_NAMEfacteur dans l'objet forme soit ce que je veux, car il correspond principalement aux comtés et aux grandes agglomérations.

> 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

Q. Comment puis-je sélectionner uniquement un sous-ensemble des données de l' shapeobjet que j'extrais du fichier de formes? Par exemple, seules les POWYS_-_POWYSpièces? Si je peux en quelque sorte inclure le FILE_NAMEdans le bloc de données qui est créé avec fortifyalors je pourrais facilement sous-définir le bloc de bardonnées mais je ne sais pas comment faire. Ou existe-t-il un moyen d'utiliser fortifypour extraire uniquement des parties de l'objet?

SlowLearner
la source

Réponses:

5

Sélectionnez un sous-ensemble des données du fichier de formes à l'aide de l'indexation:

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

fortify(sub.shape) vous donnera alors un cadre de données beaucoup plus réduit.

Simbamangu
la source
Merci, vérifiez maintenant, semble prometteur. Cela devrait-il être un ",]" à la fin?
SlowLearner
1
@slowlearner - Oups, oui, virgule manquante, mon erreur perpétuelle ...
Simbamangu