11

Using the R package sf, how does one combine sfc objects? For example, given the following code, how would one create a single sfc object sfc12 that includes the geometries from both sfc1 and sfc2? (length(sfc12) should be 2.)

library(sf)
pt1 = st_point(c(0,1))
pt2 = st_point(c(1,1))
sfc1 = st_sfc(pt1) # An sfc object
sfc2 = st_sfc(pt2) # Another sfc object
# sfc12 = ?

Some approaches that don't work:

sf_sfc(sfc1, sfc2) 
# Error in vapply(lst, class, rep("", 3)) : values must be length 3,
# but FUN(X[[1]]) result is length 2

sfc1 + sfc2 # Seems to add the points coordinate-wise.
# Geometry set for 1 feature 
# geometry type:  POINT
# dimension:      XY
# bbox:           xmin: 1 ymin: 2 xmax: 1 ymax: 2
# epsg (SRID):    NA
# proj4string:    NA
# POINT(1 2)

rbind(sfc1, sfc2)
# [,1]     
# sfc1 Numeric,2
# sfc2 Numeric,2
10

Just use c like its a vector:

> (sfc12 = c(sfc1, sfc2))
Geometry set for 2 features 
geometry type:  POINT
dimension:      XY
bbox:           xmin: 0 ymin: 1 xmax: 1 ymax: 1
epsg (SRID):    NA
proj4string:    NA
POINT(0 1)
POINT(1 1)

And the length is 2:

> length(sfc12)
[1] 2
  • 1
    and how would you combine numerous sfc objects e.g. from a list of sfc objects? – Bernd V. Feb 21 '18 at 14:05
  • did you solve it Bernd? I am also not finding a convenient way to do it. – Marco Mar 10 '18 at 7:27
  • @Marco if this is an issue for you and Bernd then start a new question with a reproducible example. – Spacedman Mar 10 '18 at 8:06
  • 6
    @Marco do.call(c, list(sfc1, sfc2)) worked for me. – johannes Mar 10 '18 at 15:24
  • 1
    Combine a list of sfc objects using Reduce(c, sfcs) or purrr::reduce(sfcs , c) – Luke1018 May 7 '18 at 14:49
2

Drawing from @TimSalabim's answer, if your sfc objects are in the same CRS you can use

do.call(rbind, list(sfc1, sfc2)).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.