web-dev-qa-db-fra.com

R convertir le code postal ou la lat / long vers le comté

J'ai une liste d'emplacements contenant une ville, un état, une fermeture à glissière, la latitude et la longitude pour chaque emplacement.

J'ai séparément une liste d'indicateurs économiques au niveau du comté. J'ai joué avec le package zipcode, le package ggmap et plusieurs autres sites Web de géocodage gratuits, y compris les fichiers Gazeer US, mais ne semblent pas sembler trouver un moyen de faire correspondre les deux pièces.

Y a-t-il actuellement des paquets ou d'autres sources qui font cela?

26
screechOwl

J'ai fini par utiliser la suggestion de JoshO'Brien mentionné ci-dessus et trouvé ici .

J'ai pris son code et j'ai changé state à county comme indiqué ici:

library(sp)
library(maps)
library(maptools)

# The single argument to this function, pointsDF, is a data.frame in which:
#   - column 1 contains the longitude in degrees (negative in the US)
#   - column 2 contains the latitude in degrees

latlong2county <- function(pointsDF) {
    # Prepare SpatialPolygons object with one SpatialPolygon
    # per county
    counties <- map('county', fill=TRUE, col="transparent", plot=FALSE)
    IDs <- sapply(strsplit(counties$names, ":"), function(x) x[1])
    counties_sp <- map2SpatialPolygons(counties, IDs=IDs,
                     proj4string=CRS("+proj=longlat +datum=WGS84"))

    # Convert pointsDF to a SpatialPoints object 
    pointsSP <- SpatialPoints(pointsDF, 
                    proj4string=CRS("+proj=longlat +datum=WGS84"))

    # Use 'over' to get _indices_ of the Polygons object containing each point 
    indices <- over(pointsSP, counties_sp)

    # Return the county names of the Polygons object containing each point
    countyNames <- sapply(counties_sp@polygons, function(x) x@ID)
    countyNames[indices]
}

# Test the function using points in Wisconsin and Oregon.
testPoints <- data.frame(x = c(-90, -120), y = c(44, 44))

latlong2county(testPoints)
[1] "wisconsin,juneau" "oregon,crook" # IT WORKS
20
screechOwl

Les codes postaux correspondants aux comtés sont difficiles. (Certains codes postaux couvrent plus d'un comté et parfois plus d'un état. Par exemple 30165)

Je ne suis pas au courant d'un package R spécifique qui peut correspondre à ceux-ci pour vous.

Cependant, vous pouvez obtenir une belle table du centre de données du recensement du Missouri.
[.____] Vous pouvez utiliser ce qui suit pour l'extraction de données: http://bit.ly/s63ln

Un exemple de sortie pourrait ressembler à:

    state,zcta5,ZIPName,County,County2
    01,30165,"Rome, GA",Cherokee AL,
    01,31905,"Fort Benning, GA",Russell AL,
    01,35004,"Moody, AL",St. Clair AL,
    01,35005,"Adamsville, AL",Jefferson AL,
    01,35006,"Adger, AL",Jefferson AL,Walker AL
    ...

Notez le comté2. L'explication de métadonnées peut être trouvée ICI .

    county 
    The county in which the ZCTA is all or mostly contained. Over 90% of ZCTAs fall entirely within a single county.

    county2 
    The "secondary" county for the ZCTA, i.e. the county which has the 2nd largest intersection with it. Over 90% of the time this value will be blank.

Voir aussi les codes du comté d'ANSI http://www.census.gov/geo/www/ansi/ansi.html

8
Ricardo Saporta

Je pense que le colis "noncensus" est utile.

correspondant est ce que j'utilise pour faire correspondre le code postal avec le comté

### code for get county based on zipcode

library(noncensus)
data(Zip_codes)
data(counties)

state_fips  = as.numeric(as.character(counties$state_fips))
county_fips = as.numeric(as.character(counties$county_fips))    
counties$fips = state_fips*1000+county_fips    
Zip_codes$fips =  as.numeric(as.character(Zip_codes$fips))

# test
temp = subset(Zip_codes, Zip == "30329")    
subset(counties, fips == temp$fips)
5
Fang Terry

Une option simple consiste à utiliser la fonction geocode() dans ggmap _, avec l'option output="more" Ou output="all.

Cela peut prendre des entrées flexibles, telles que l'adresse ou la/lon, et renvoie l'adresse, la ville, le comté, l'état, le pays, le code postal, etc., en tant que liste.

require("ggmap")
address <- geocode("Yankee Stadium", output="more")

str(address)
$ lon                        : num -73.9
$ lat                        : num 40.8
$ type                       : Factor w/ 1 level "stadium": 1
$ loctype                    : Factor w/ 1 level "approximate": 1
$ address                    : Factor w/ 1 level "yankee stadium, 1 east 161st street, bronx, ny 10451, usa": 1
$ north                      : num 40.8
$ south                      : num 40.8
$ east                       : num -73.9
$ west                       : num -73.9
$ postal_code                : chr "10451"
$ country                    : chr "united states"
$ administrative_area_level_2: chr "bronx"
$ administrative_area_level_1: chr "ny"
$ locality                   : chr "new york"
$ street                     : chr "east 161st street"
$ streetNo                   : num 1
$ point_of_interest          : chr "yankee stadium"
$ query                      : chr "Yankee Stadium"

Une autre solution consiste à utiliser un fichier de formes de recensement, et la même over() de la question. J'ai rencontré un problème en utilisant la carte de base CarteTools: car il utilise le document WGS84 Datum, en Amérique du Nord, des points situés à quelques kilomètres de la côte ont été cartographiés de manière incorrecte et environ 5% de mon ensemble de données ne correspondaient pas.

essayez ceci, en utilisant les fichiers de format sp packages et de recensement.

counties <- readShapeSpatial("maps/tl_2013_us_county.shp", proj4string=CRS("+proj=longlat +datum=NAD83"))

# Convert pointsDF to a SpatialPoints object 
pointsSP <- SpatialPoints(pointsDF, proj4string=CRS("+proj=longlat +datum=NAD83"))

countynames <- over(pointsSP, counties)
countynames <- countynames$NAMELSAD
3
ano