Joignez le fichier CSV au fichier de formes

9

Je voulais joindre un fichier CSV à un fichier de formes.

Lorsque j'ai identifié un champ pour faciliter la jointure, par exemple,

map <- spChFIDs(map, as.character(map$ID))

il est revenu

Erreur dans les spChFID (SP, x): les longueurs diffèrent

Quelqu'un peut-il conseiller?

user3915459
la source
Merci. Mais l'ID de colonne a des valeurs uniques qui peuvent être utilisées comme champ de jointure. Les entrées du champ doivent-elles être de même longueur?
user3915459
Pourriez-vous publier un échantillon de votre carte et csv?
cengel
@cengel C'est un énorme ensemble de données et une capture d'écran ne sera pas suffisante pour montrer les variations. Le champ "ID" dans le fichier de formes "map" est une chaîne de nombres (avec différents nombres de chiffres).
user3915459
Enregistrez peut-être le CSV dans une table, afin que vous sachiez que les champs de jointure sont du même type de données.
klewis

Réponses:

7

Voici comment vous pouvez le faire dans R en utilisant sp::merge

library(raster)
# read data    
p <- shapefile("path/file.shp")
d <- read.csv("path/file.csv")

# merge on common variable, here called 'key'
m <- merge(p, d, by='key')

# perhaps save as shapefile again
shapefile(m, "path/merged.shp")
Robert Hijmans
la source
Bonjour @RobertH, j'ai été envoyé ici à partir de la question que j'ai posée hier. Lorsque je fusionne par la variable commune, dois-je extraire cette variable du fichier de formes ou du CSV? Le contenu des deux variables correspond, mais pas par nom. J'ai essayé de jouer avec elle un peu et je continue à obtenir des erreurs (principalement: Erreur dans [.data.frame(x @ data,, by.x, drop = FALSE): colonnes non définies sélectionnées)
Lauren
1
Deviner. Parce que je devais joindre les deux couches qui avaient des noms différents, j'ai dû modifier un peu le format. Cela ressemblait plus à une fusion (p, d, by.x = "key", by.y = "matching.key")
Lauren
3

Je ne sais pas comment faire avec R pour joindre un fichier de formes avec un csv. Cependant, si cela peut vous aider, vous pouvez également le faire sur QGIS en utilisant le pluggin MMQGIS.

entrez la description de l'image ici

Leasye
la source
Merci. J'ai déjà essayé avec ArcGIS mais l'ensemble de données est énorme et je préfère le faire dans R.
user3915459
2

Si vous travaillez dans R, votre fichier de formes et .csv doivent être chargés en tant que data.frame ou data.table. Vous pouvez utiliser join () pour les fusionner.

Avez-vous plus d'informations sur le type de fichier de formes que vous possédez?

J'ai eu la chance de faire ce qui suit lorsque je fusionne des fichiers de formes et des données. Notez que vous devez laisser l'extension .shp dans l'argument "layer". J'ai utilisé "GEOID" où vous mettriez le nom de la "forme" en question.

library("rgdal")
library("data.table")
shapefile = readOGR(dsn = "DIRECTORY WITH SHAPEFILES", layer = "THE ACTUAL SHAPEFILE")
shapefile@data$id = rownames(shapefile@data)
shapefile.points = fortify(shapefile, region = "id")
shapefile.df = join(shapefile.points, shapefile@data, by = "id")
shapefile.df = subset(shapefile.df, select = c(long, lat, group, GEOID))
names(shapefile.df) = c("long", "lat", "group", "GEOID")

Ensuite, vous pouvez fusionner vos données en utilisant quelque chose comme

full.data = join(mydata, shapefile.df, by = "GEOID", type = "full")
Nancy
la source
1

Si vous travaillez dans R, la fusion n'est en fait pas nécessaire. Vous pouvez utiliser ggplot pour afficher vos données sur une carte. Voyez, mon exemple. Cette doublure fait des merveilles avec le fichier de forme bangladesh = fortify(p1, region = "ADM1_EN"). Et puis, vous pouvez utiliser

ggplot() + geom_map(data = br2016a, aes(map_id = ADM1_EN, fill = HectareLocal), 
                    map =bangladesh) +
  expand_limits(x = bangladesh$long, y = bangladesh$lat) + 
  coord_fixed(.96) +
  scale_fill_gradient(low="thistle2", high="darkred", 
                      guide="colorbar", na.value="white") +
  labs(title = "Bangladesh Boro Rice (Local variety), 2016", x = element_blank(), y = element_blank(), 
       fill='Hectares') +   theme(legend.position = "bottom") 

Et, la carte que je reçois est ici.

Production

Ambrish Dhaka
la source