[R-sig-Geo] [Help] Error in spChFIDs(SP, x) : lengths differ

Edzer Pebesma edzer.pebesma at uni-muenster.de
Fri Sep 4 17:47:14 CEST 2015


On 09/04/2015 03:53 PM, Ignacio Martinez wrote:
> Thanks Edzer. I think I understand the problem better now (this is all
> very new to me). Is there a solution so I can generate the map with my data?
> 

The STUSPS fields of counts and states match, but you seem to filter the
attribute table after you merged counts and states, which drops PR, but
doesn't take it out of states:

> match(c("PR", "na", "MH", "FM", "PW"), counts$STUSPS)
[1] 52 NA NA NA NA

So, in case you want to deselect PR, a shorter way to get there is

> m = merge(states, counts) # uses sp::merge.Spatial
> m = m[-which(m$STUSPS == "PR"),]
> length(m)
[1] 55



> Thanks again!
> 
> On Fri, Sep 4, 2015 at 9:51 AM Edzer Pebesma
> <edzer.pebesma at uni-muenster.de <mailto:edzer.pebesma at uni-muenster.de>>
> wrote:
> 
> 
> 
>     On 09/04/2015 03:29 PM, Ignacio Martinez wrote:
>     > I'm trying to create a map using leaflet. I'm basically following this
>     > <https://github.com/rstudio/leaflet/issues/169>but my data is a bit
>     > different this time around. Additionally, I'm using dplyr instead of
>     > data.table.
>     >
>     > This is the code i'm trying to run:
>     >
>     >     counts <-
>     >       structure(
>     >         list(
>     >           STUSPS = c(
>     >             "CA", "NC", "TX", "FL", "VA", "OH",
>     >             "NY", "GA", "IL", "WA", "CO", "AZ", "MD", "LA", "SC",
>     "KS",
>     > "DC",
>     >             "TN", "MA", "MI", "MN", "NJ", "WI", "PA", "AL", "KY",
>     "OK",
>     > "MO",
>     >             "ID", "MS", "NM", "IN", "NV", "AR", "OR", "AK", "UT",
>     "IA",
>     > "MT",
>     >             "HI", "NE", "CT", "WV", "WY", "SD", "VT", "ND", "ME",
>     "RI",
>     > "NH",
>     >             "DE", "PR", "GU", "VI", "MP", "AS"
>     >           ), count = c(
>     >             36511L, 27513L,
>     >             25861L, 21099L, 19415L, 17012L, 15860L, 14362L,
>     13923L, 13753L,
>     >             11671L, 10540L, 9777L, 8923L, 8355L, 8219L, 8142L,
>     8076L, 7985L,
>     >             7770L, 7662L, 7531L, 7273L, 7212L, 7042L, 6708L,
>     6674L, 6429L,
>     >             6239L, 5580L, 5395L, 5172L, 5013L, 4933L, 4911L,
>     4797L, 4694L,
>     >             4458L, 3873L, 3757L, 3608L, 3111L, 2604L, 2217L,
>     2156L, 2143L,
>     >             2030L, 1544L, 1417L, 1168L, 772L, 531L, 148L, 63L, 7L, 2L
>     >           )
>     >         ), .Names = c("STUSPS",
>     >                       "count"), class = c("tbl_df", "tbl",
>     "data.frame"),
>     > row.names = c(NA,-56L)
>     >       )
>     >
>     >
>     >     x = c("leaflet", "rgdal", "maptools", "mapproj", "rgeos", "dplyr")
>     >     lapply(x, library, character.only = TRUE)
>     >     # From
>     https://www.census.gov/geo/maps-data/data/cbf/cbf_state.html
>     >     states  <- readOGR(dsn = "./cb_2014_us_state_5m.shp",
>     >                        layer = "cb_2014_us_state_5m", verbose = FALSE)
>     >     # Make a copy of the SPDF attribute table, and then work
>     normally, as
>     > with any data.frame/data.table object
>     >     states.df <- states at data
>     >     # Create an explicit attribute to keep polygons IDs (useful to
>     > "re-attach" the table to the polygons later)
>     >     states.df <- states.df %>% mutate(rn=row.names(states))
>     >
>     >     # join them
>     >     states.df <- full_join(x = states.df, y = counts, by="STUSPS") %>%
>     >       filter(!(STUSPS%in%c("PR", "na", "MH", "FM", "PW"))) %>%
>     na.omit() %>%
>     >       mutate(popup=paste0('<b>',NAME,'</b>','<br>',
>     >                           '<b>count:</b> ',
>     > prettyNum(count,big.mark=",",scientific=FALSE)))
> 
>     at this stage, you have:
> 
>     > dim(states at data)
>     [1] 56  9
>     > dim(states.df)
>     [1] 55 12
> 
>     >
>     >     # Re-attach the attribute table to the SPDF
>     >     states at data <- states.df
> 
>     now, you created an invalid object:
>     > length(geometry(states))
>     [1] 56
>     > dim(states at data)
>     [1] 55 12
> 
>     this confirms once more what has been said on this list so often, that
>     instead of using constructor functions such as
>     SpatialPolygonsDataFrame(), assigning slots directly is dangerous and
>     better left to those who know what they do (and check sanity):
> 
>     > states <- SpatialPolygonsDataFrame(geometry(states), states.df)
>     Error in SpatialPolygonsDataFrame(geometry(states), states.df) :
>       Object length mismatch:
>          geometry(states) has 56 Polygons objects, but states.df has 55 rows
> 
> 
>     >     # Make sure polygons IDs and data.frame row.names match
>     >     states <- spChFIDs(states, states$rn)
>     >
>     >     # Create map as usual...
>     >
>     > The error I get is:
>     >
>     > Error in spChFIDs(SP, x) : lengths differ
>     >
>     >
>     > Thanks for the help!
>     >
>     >
>     > Ignacio
>     >
>     >       [[alternative HTML version deleted]]
>     >
>     > _______________________________________________
>     > R-sig-Geo mailing list
>     > R-sig-Geo at r-project.org <mailto:R-sig-Geo at r-project.org>
>     > https://stat.ethz.ch/mailman/listinfo/r-sig-geo
>     >
> 
>     --
>     Edzer Pebesma
>     Institute for Geoinformatics (ifgi),  University of Münster,
>     Heisenbergstraße 2, 48149 Münster, Germany; +49 251 83 33081
>     Journal of Statistical Software:   http://www.jstatsoft.org/
>     Computers & Geosciences:   http://elsevier.com/locate/cageo/
>     Spatial Statistics Society http://www.spatialstatistics.info
> 
>     _______________________________________________
>     R-sig-Geo mailing list
>     R-sig-Geo at r-project.org <mailto:R-sig-Geo at r-project.org>
>     https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> 

-- 
Edzer Pebesma
Institute for Geoinformatics (ifgi),  University of Münster,
Heisenbergstraße 2, 48149 Münster, Germany; +49 251 83 33081
Journal of Statistical Software:   http://www.jstatsoft.org/
Computers & Geosciences:   http://elsevier.com/locate/cageo/
Spatial Statistics Society http://www.spatialstatistics.info

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 490 bytes
Desc: OpenPGP digital signature
URL: <https://stat.ethz.ch/pipermail/r-sig-geo/attachments/20150904/4b2dd0c5/attachment.bin>


More information about the R-sig-Geo mailing list