Skip to content

Instantly share code, notes, and snippets.

@elipousson
Last active December 15, 2023 19:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save elipousson/d423349f98b4afd35920afd672ad2617 to your computer and use it in GitHub Desktop.
Save elipousson/d423349f98b4afd35920afd672ad2617 to your computer and use it in GitHub Desktop.
Notes on sf compatibility with dplyr (and eventually other tidyverse) functions. Updated 2023-12-15.
library(sf)
#> Linking to GEOS 3.11.0, GDAL 3.5.3, PROJ 9.1.0; sf_use_s2() is TRUE
library(tidyverse)

# 2023-12-15
# Notes to add to https://geocompr.r-universe.dev/articles/geocompkg/tidyverse-pitfalls.html

nc = st_read(system.file("shape/nc.shp", package="sf"))
#> Reading layer `nc' from data source 
#>   `/Users/elipousson/Library/R/arm64/4.3/library/sf/shape/nc.shp' 
#>   using driver `ESRI Shapefile'
#> Simple feature collection with 100 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27

nc_modified = nc |> 
  mutate(
    SID_increase = SID79 > SID74
  )
# select always returns a sf object
select(nc, SID74)
#> Simple feature collection with 100 features and 1 field
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>    SID74                       geometry
#> 1      1 MULTIPOLYGON (((-81.47276 3...
#> 2      0 MULTIPOLYGON (((-81.23989 3...
#> 3      5 MULTIPOLYGON (((-80.45634 3...
#> 4      1 MULTIPOLYGON (((-76.00897 3...
#> 5      9 MULTIPOLYGON (((-77.21767 3...
#> 6      7 MULTIPOLYGON (((-76.74506 3...
#> 7      0 MULTIPOLYGON (((-76.00897 3...
#> 8      0 MULTIPOLYGON (((-76.56251 3...
#> 9      4 MULTIPOLYGON (((-78.30876 3...
#> 10     1 MULTIPOLYGON (((-80.02567 3...

# select returns a 0 fields sf object when selecting the sfc column
select(nc, geometry)
#> Simple feature collection with 100 features and 0 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>                          geometry
#> 1  MULTIPOLYGON (((-81.47276 3...
#> 2  MULTIPOLYGON (((-81.23989 3...
#> 3  MULTIPOLYGON (((-80.45634 3...
#> 4  MULTIPOLYGON (((-76.00897 3...
#> 5  MULTIPOLYGON (((-77.21767 3...
#> 6  MULTIPOLYGON (((-76.74506 3...
#> 7  MULTIPOLYGON (((-76.00897 3...
#> 8  MULTIPOLYGON (((-76.56251 3...
#> 9  MULTIPOLYGON (((-78.30876 3...
#> 10 MULTIPOLYGON (((-80.02567 3...
# filter can work with geometry column
nc |> 
  filter(
    st_geometry_type(geometry) == "POINT"
  )
#> Simple feature collection with 0 features and 14 fields
#> Bounding box:  xmin: NA ymin: NA xmax: NA ymax: NA
#> Geodetic CRS:  NAD27
#>  [1] AREA      PERIMETER CNTY_     CNTY_ID   NAME      FIPS      FIPSNO   
#>  [8] CRESS_ID  BIR74     SID74     NWBIR74   BIR79     SID79     NWBIR79  
#> [15] geometry 
#> <0 rows> (or 0-length row.names)

# Binary predicates return matrices which will generate a warning message even if it is one column
nc |> 
  filter(
    st_is_within_distance(geometry, nc[1, ], dist = units::set_units(300000, "m"), sparse = FALSE)
  )
#> Warning: Using one column matrices in `filter()` was deprecated in dplyr 1.1.0.
#> ℹ Please use one dimensional logical vectors instead.
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
#> generated.
#> Simple feature collection with 73 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.94867 xmax: -77.07531 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 5  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 6  0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#> 7  0.114     1.352  1838    1838     Caswell 37033  37033       17  1035     2
#> 8  0.153     1.616  1839    1839  Rockingham 37157  37157       79  4449    16
#> 9  0.143     1.663  1840    1840   Granville 37077  37077       39  1671     4
#> 10 0.109     1.325  1841    1841      Person 37145  37145       73  1556     4
#>    NWBIR74 BIR79 SID79 NWBIR79                       geometry
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 5      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 6      160  2038     5     176 MULTIPOLYGON (((-80.02567 3...
#> 7      550  1253     2     597 MULTIPOLYGON (((-79.53051 3...
#> 8     1243  5386     5    1369 MULTIPOLYGON (((-79.53051 3...
#> 9      930  2074     4    1058 MULTIPOLYGON (((-78.74912 3...
#> 10     613  1790     4     650 MULTIPOLYGON (((-78.8068 36...

# Use as.logical to avoid passing a one-column matrix as a filter predicate
nc |> 
  filter(
    as.logical(st_is_within_distance(geometry, nc[1, ], dist = units::set_units(300000, "m"), sparse = FALSE))
  )
#> Simple feature collection with 73 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.94867 xmax: -77.07531 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 5  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 6  0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#> 7  0.114     1.352  1838    1838     Caswell 37033  37033       17  1035     2
#> 8  0.153     1.616  1839    1839  Rockingham 37157  37157       79  4449    16
#> 9  0.143     1.663  1840    1840   Granville 37077  37077       39  1671     4
#> 10 0.109     1.325  1841    1841      Person 37145  37145       73  1556     4
#>    NWBIR74 BIR79 SID79 NWBIR79                       geometry
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 5      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 6      160  2038     5     176 MULTIPOLYGON (((-80.02567 3...
#> 7      550  1253     2     597 MULTIPOLYGON (((-79.53051 3...
#> 8     1243  5386     5    1369 MULTIPOLYGON (((-79.53051 3...
#> 9      930  2074     4    1058 MULTIPOLYGON (((-78.74912 3...
#> 10     613  1790     4     650 MULTIPOLYGON (((-78.8068 36...

# discussion on performance issues w/ filter https://github.com/r-spatial/sf/issues/1889
# Geometric unary operations st_ functions work inside of mutate
nc |> 
  mutate(
    geometry = st_centroid(geometry)
  )
#> Simple feature collection with 100 features and 14 fields
#> Geometry type: POINT
#> Dimension:     XY
#> Bounding box:  xmin: -84.05986 ymin: 34.07671 xmax: -75.8095 ymax: 36.49111
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79                   geometry
#> 1       10  1364     0      19  POINT (-81.49823 36.4314)
#> 2       10   542     3      12 POINT (-81.12513 36.49111)
#> 3      208  3616     6     260 POINT (-80.68573 36.41252)
#> 4      123   830     2     145 POINT (-76.02719 36.40714)
#> 5     1066  1606     3    1197 POINT (-77.41046 36.42236)
#> 6      954  1838     5    1237 POINT (-76.99472 36.36142)
#> 7      115   350     2     139 POINT (-76.23402 36.40122)
#> 8      254   594     2     371 POINT (-76.70446 36.44428)
#> 9      748  1190     2     844 POINT (-78.11042 36.39693)
#> 10     160  2038     5     176 POINT (-80.23429 36.40042)

# Computing geometric measurements works inside of mutate
nc |> 
  mutate(
    dist = st_distance(st_centroid(geometry), nc[1, ])
  )
#> Simple feature collection with 100 features and 15 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79                       geometry          dist
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...      0.00 [m]
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...  13969.67 [m]
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...  49807.60 [m]
#> 4      123   830     2     145 MULTIPOLYGON (((-76.00897 3... 466586.78 [m]
#> 5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3... 342798.12 [m]
#> 6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3... 380092.07 [m]
#> 7      115   350     2     139 MULTIPOLYGON (((-76.00897 3... 448090.87 [m]
#> 8      254   594     2     371 MULTIPOLYGON (((-76.56251 3... 405954.77 [m]
#> 9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3... 280166.05 [m]
#> 10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...  90104.97 [m]
# summarise looks like it supports the .by parameter but geometry for both groups are identical
# open issue: https://github.com/r-spatial/sf/issues/2207
nc_modified_by <- nc_modified |> 
  summarise(
    .by = SID_increase
  )

# compared to group_by method
nc_modified_group_by <- nc_modified |> 
  group_by(SID_increase) |> 
  summarise()

# maps to show differences

nc_modified_by |> 
  ggplot() +
  geom_sf(aes(fill = SID_increase))

nc_modified_group_by |>
  ggplot() +
  geom_sf(aes(fill = SID_increase))

# you can't use left_join, full_join, or right_join if both x and y are sf objects
withCallingHandlers(
  nc |> 
    left_join(
      nc_modified
    ),
  error = function(cnd) {
    print(cnd$message)
  }
)
#> [1] "y should not have class sf; for spatial joins, use st_join"
#> Error: y should not have class sf; for spatial joins, use st_join


# Dropping geometry from y
nc |> 
  left_join(
    st_drop_geometry(nc_modified)
  )
#> Joining with `by = join_by(AREA, PERIMETER, CNTY_, CNTY_ID, NAME, FIPS, FIPSNO,
#> CRESS_ID, BIR74, SID74, NWBIR74, BIR79, SID79, NWBIR79)`
#> Simple feature collection with 100 features and 15 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79 SID_increase                       geometry
#> 1       10  1364     0      19        FALSE MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12         TRUE MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260         TRUE MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145         TRUE MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197        FALSE MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237        FALSE MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139         TRUE MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371         TRUE MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844        FALSE MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176         TRUE MULTIPOLYGON (((-80.02567 3...

# Dropping geometry from x and using geometry from y
nc |> 
  st_drop_geometry() |> 
  # NOTE: This method can create empty geometries
  left_join(nc_modified) |> 
  st_as_sf()
#> Joining with `by = join_by(AREA, PERIMETER, CNTY_, CNTY_ID, NAME, FIPS, FIPSNO,
#> CRESS_ID, BIR74, SID74, NWBIR74, BIR79, SID79, NWBIR79)`
#> Simple feature collection with 100 features and 15 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79 SID_increase                       geometry
#> 1       10  1364     0      19        FALSE MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12         TRUE MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260         TRUE MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145         TRUE MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197        FALSE MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237        FALSE MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139         TRUE MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371         TRUE MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844        FALSE MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176         TRUE MULTIPOLYGON (((-80.02567 3...
# rename works with geometry columns
rename(
  nc,
  geom = geometry
)
#> Simple feature collection with 100 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79                           geom
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...

# rename is the same as this
st_set_geometry(nc, "geom")
#> Simple feature collection with 100 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79                           geom
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145 MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139 MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371 MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...
# distinct with a geometry column returns an sf object
nc |> 
  distinct(geometry)
#> Simple feature collection with 100 features and 0 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>                          geometry
#> 1  MULTIPOLYGON (((-81.47276 3...
#> 2  MULTIPOLYGON (((-81.23989 3...
#> 3  MULTIPOLYGON (((-80.45634 3...
#> 4  MULTIPOLYGON (((-76.00897 3...
#> 5  MULTIPOLYGON (((-77.21767 3...
#> 6  MULTIPOLYGON (((-76.74506 3...
#> 7  MULTIPOLYGON (((-76.00897 3...
#> 8  MULTIPOLYGON (((-76.56251 3...
#> 9  MULTIPOLYGON (((-78.30876 3...
#> 10 MULTIPOLYGON (((-80.02567 3...

# distinct with an attibute column returns a data frame
nc |> 
  distinct(SID74)
#>    SID74
#> 1      1
#> 2      0
#> 3      5
#> 4      9
#> 5      7
#> 6      4
#> 7      2
#> 8     16
#> 9     18
#> 10     3
#> 11    10
#> 12    23
#> 13    13
#> 14     6
#> 15     8
#> 16    11
#> 17    14
#> 18    12
#> 19    44
#> 20    38
#> 21    15
#> 22    29
#> 23    31

# distinct with an attribute column and .keep_all = TRUE returns a data frame
nc |> 
  distinct(SID74, .keep_all = TRUE)
#> Simple feature collection with 23 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -82.27872 ymin: 34.30457 xmax: -76.11271 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 5  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 6  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 7  0.114     1.352  1838    1838     Caswell 37033  37033       17  1035     2
#> 8  0.153     1.616  1839    1839  Rockingham 37157  37157       79  4449    16
#> 9  0.190     2.204  1846    1846     Halifax 37083  37083       42  3608    18
#> 10 0.053     1.171  1848    1848  Pasquotank 37139  37139       70  1638     3
#>    NWBIR74 BIR79 SID79 NWBIR79                       geometry
#> 1       10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4     1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 5      954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
#> 6      748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 7      550  1253     2     597 MULTIPOLYGON (((-79.53051 3...
#> 8     1243  5386     5    1369 MULTIPOLYGON (((-79.53051 3...
#> 9     2365  4463    17    2980 MULTIPOLYGON (((-77.33221 3...
#> 10     622  2275     4     933 MULTIPOLYGON (((-76.29893 3...

# inconsistency discussed in this GitHub issue https://github.com/r-spatial/sf/issues/1477
# bind_rows always returns a sf object if x input is an sf object
bind_rows(nc, nc_modified)
#> Simple feature collection with 200 features and 15 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79 SID_increase                       geometry
#> 1       10  1364     0      19           NA MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12           NA MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260           NA MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145           NA MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197           NA MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237           NA MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139           NA MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371           NA MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844           NA MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176           NA MULTIPOLYGON (((-80.02567 3...

# bind_rows is superseded but not deprecated
# https://github.com/r-spatial/sf/issues/2157

# list_rbind always returns a data frame that needs to be converted back into a sf object
list_rbind(list(nc, nc_modified))
#>      AREA PERIMETER CNTY_ CNTY_ID         NAME  FIPS FIPSNO CRESS_ID BIR74
#> 1   0.114     1.442  1825    1825         Ashe 37009  37009        5  1091
#> 2   0.061     1.231  1827    1827    Alleghany 37005  37005        3   487
#> 3   0.143     1.630  1828    1828        Surry 37171  37171       86  3188
#> 4   0.070     2.968  1831    1831    Currituck 37053  37053       27   508
#> 5   0.153     2.206  1832    1832  Northampton 37131  37131       66  1421
#> 6   0.097     1.670  1833    1833     Hertford 37091  37091       46  1452
#> 7   0.062     1.547  1834    1834       Camden 37029  37029       15   286
#> 8   0.091     1.284  1835    1835        Gates 37073  37073       37   420
#> 9   0.118     1.421  1836    1836       Warren 37185  37185       93   968
#> 10  0.124     1.428  1837    1837       Stokes 37169  37169       85  1612
#> 11  0.114     1.352  1838    1838      Caswell 37033  37033       17  1035
#> 12  0.153     1.616  1839    1839   Rockingham 37157  37157       79  4449
#> 13  0.143     1.663  1840    1840    Granville 37077  37077       39  1671
#> 14  0.109     1.325  1841    1841       Person 37145  37145       73  1556
#> 15  0.072     1.085  1842    1842        Vance 37181  37181       91  2180
#> 16  0.190     2.204  1846    1846      Halifax 37083  37083       42  3608
#> 17  0.053     1.171  1848    1848   Pasquotank 37139  37139       70  1638
#> 18  0.199     1.984  1874    1874       Wilkes 37193  37193       97  3146
#> 19  0.081     1.288  1880    1880      Watauga 37189  37189       95  1323
#> 20  0.063     1.000  1881    1881   Perquimans 37143  37143       72   484
#> 21  0.044     1.158  1887    1887       Chowan 37041  37041       21   751
#> 22  0.064     1.213  1892    1892        Avery 37011  37011        6   781
#> 23  0.086     1.267  1893    1893       Yadkin 37197  37197       99  1269
#> 24  0.128     1.554  1897    1897     Franklin 37069  37069       35  1399
#> 25  0.108     1.483  1900    1900      Forsyth 37067  37067       34 11858
#> 26  0.170     1.680  1903    1903     Guilford 37081  37081       41 16184
#> 27  0.111     1.392  1904    1904     Alamance 37001  37001        1  4672
#> 28  0.180     2.151  1905    1905       Bertie 37015  37015        8  1324
#> 29  0.104     1.294  1907    1907       Orange 37135  37135       68  3164
#> 30  0.077     1.271  1908    1908       Durham 37063  37063       32  7970
#> 31  0.142     1.640  1913    1913         Nash 37127  37127       64  4021
#> 32  0.059     1.319  1927    1927     Mitchell 37121  37121       61   671
#> 33  0.131     1.521  1928    1928    Edgecombe 37065  37065       33  3657
#> 34  0.122     1.516  1932    1932     Caldwell 37027  37027       14  3609
#> 35  0.080     1.307  1936    1936       Yancey 37199  37199      100   770
#> 36  0.118     1.899  1937    1937       Martin 37117  37117       59  1549
#> 37  0.219     2.130  1938    1938         Wake 37183  37183       92 14484
#> 38  0.118     1.601  1946    1946      Madison 37115  37115       58   765
#> 39  0.155     1.781  1947    1947      Iredell 37097  37097       49  4139
#> 40  0.069     1.201  1948    1948        Davie 37059  37059       30  1207
#> 41  0.066     1.070  1950    1950    Alexander 37003  37003        2  1333
#> 42  0.145     1.791  1951    1951     Davidson 37057  37057       29  5509
#> 43  0.134     1.755  1958    1958        Burke 37023  37023       12  3573
#> 44  0.100     1.331  1962    1962   Washington 37187  37187       94   990
#> 45  0.099     1.411  1963    1963      Tyrrell 37177  37177       89   248
#> 46  0.116     1.664  1964    1964     McDowell 37111  37111       56  1946
#> 47  0.201     1.805  1968    1968     Randolph 37151  37151       76  4456
#> 48  0.180     2.142  1973    1973      Chatham 37037  37037       19  1646
#> 49  0.094     1.307  1979    1979       Wilson 37195  37195       98  3702
#> 50  0.134     1.590  1980    1980        Rowan 37159  37159       80  4606
#> 51  0.168     1.791  1984    1984         Pitt 37147  37147       74  5094
#> 52  0.106     1.444  1986    1986      Catawba 37035  37035       18  5754
#> 53  0.168     1.995  1988    1988     Buncombe 37021  37021       11  7515
#> 54  0.207     1.851  1989    1989     Johnston 37101  37101       51  3999
#> 55  0.144     1.690  1996    1996      Haywood 37087  37087       44  2110
#> 56  0.094     3.640  2000    2000         Dare 37055  37055       28   521
#> 57  0.203     3.197  2004    2004     Beaufort 37013  37013        7  2692
#> 58  0.141     2.316  2013    2013        Swain 37173  37173       87   675
#> 59  0.070     1.105  2016    2016       Greene 37079  37079       40   870
#> 60  0.065     1.093  2026    2026          Lee 37105  37105       53  2252
#> 61  0.146     1.778  2027    2027   Rutherford 37161  37161       81  2992
#> 62  0.142     1.655  2029    2029        Wayne 37191  37191       96  6638
#> 63  0.154     1.680  2030    2030      Harnett 37085  37085       43  3776
#> 64  0.118     1.506  2032    2032    Cleveland 37045  37045       23  4866
#> 65  0.078     1.384  2034    2034      Lincoln 37109  37109       55  2216
#> 66  0.125     1.601  2039    2039      Jackson 37099  37099       50  1143
#> 67  0.181     1.980  2040    2040        Moore 37125  37125       63  2648
#> 68  0.143     1.887  2041    2041  Mecklenburg 37119  37119       60 21588
#> 69  0.091     1.321  2042    2042     Cabarrus 37025  37025       13  4099
#> 70  0.130     1.732  2044    2044   Montgomery 37123  37123       62  1258
#> 71  0.103     1.461  2045    2045       Stanly 37167  37167       84  2356
#> 72  0.095     1.471  2047    2047    Henderson 37089  37089       45  2574
#> 73  0.078     1.202  2056    2056       Graham 37075  37075       38   415
#> 74  0.104     1.548  2065    2065       Lenoir 37107  37107       54  3589
#> 75  0.098     1.389  2067    2067 Transylvania 37175  37175       88  1173
#> 76  0.091     1.470  2068    2068       Gaston 37071  37071       36  9014
#> 77  0.060     1.036  2071    2071         Polk 37149  37149       75   533
#> 78  0.131     1.677  2082    2082        Macon 37113  37113       57   797
#> 79  0.241     2.214  2083    2083      Sampson 37163  37163       82  3025
#> 80  0.082     1.388  2085    2085      Pamlico 37137  37137       69   542
#> 81  0.120     1.686  2088    2088     Cherokee 37039  37039       20  1027
#> 82  0.172     1.835  2090    2090   Cumberland 37051  37051       26 20366
#> 83  0.121     1.978  2091    2091        Jones 37103  37103       52   578
#> 84  0.163     1.716  2095    2095        Union 37179  37179       90  3915
#> 85  0.138     1.621  2096    2096        Anson 37007  37007        4  1570
#> 86  0.098     1.262  2097    2097         Hoke 37093  37093       47  1494
#> 87  0.167     2.709  2099    2099         Hyde 37095  37095       48   338
#> 88  0.204     1.871  2100    2100       Duplin 37061  37061       31  2483
#> 89  0.121     1.855  2107    2107     Richmond 37153  37153       77  2756
#> 90  0.051     1.096  2109    2109         Clay 37043  37043       22   284
#> 91  0.177     2.916  2119    2119       Craven 37049  37049       25  5868
#> 92  0.080     1.188  2123    2123     Scotland 37165  37165       83  2255
#> 93  0.195     1.783  2146    2146       Onslow 37133  37133       67 11158
#> 94  0.240     2.004  2150    2150      Robeson 37155  37155       78  7889
#> 95  0.125     2.868  2156    2156     Carteret 37031  37031       16  2414
#> 96  0.225     2.107  2162    2162       Bladen 37017  37017        9  1782
#> 97  0.214     2.152  2185    2185       Pender 37141  37141       71  1228
#> 98  0.240     2.365  2232    2232     Columbus 37047  37047       24  3350
#> 99  0.042     0.999  2238    2238  New Hanover 37129  37129       65  5526
#> 100 0.212     2.024  2241    2241    Brunswick 37019  37019       10  2181
#> 101 0.114     1.442  1825    1825         Ashe 37009  37009        5  1091
#> 102 0.061     1.231  1827    1827    Alleghany 37005  37005        3   487
#> 103 0.143     1.630  1828    1828        Surry 37171  37171       86  3188
#> 104 0.070     2.968  1831    1831    Currituck 37053  37053       27   508
#> 105 0.153     2.206  1832    1832  Northampton 37131  37131       66  1421
#> 106 0.097     1.670  1833    1833     Hertford 37091  37091       46  1452
#> 107 0.062     1.547  1834    1834       Camden 37029  37029       15   286
#> 108 0.091     1.284  1835    1835        Gates 37073  37073       37   420
#> 109 0.118     1.421  1836    1836       Warren 37185  37185       93   968
#> 110 0.124     1.428  1837    1837       Stokes 37169  37169       85  1612
#> 111 0.114     1.352  1838    1838      Caswell 37033  37033       17  1035
#> 112 0.153     1.616  1839    1839   Rockingham 37157  37157       79  4449
#> 113 0.143     1.663  1840    1840    Granville 37077  37077       39  1671
#> 114 0.109     1.325  1841    1841       Person 37145  37145       73  1556
#> 115 0.072     1.085  1842    1842        Vance 37181  37181       91  2180
#> 116 0.190     2.204  1846    1846      Halifax 37083  37083       42  3608
#> 117 0.053     1.171  1848    1848   Pasquotank 37139  37139       70  1638
#> 118 0.199     1.984  1874    1874       Wilkes 37193  37193       97  3146
#> 119 0.081     1.288  1880    1880      Watauga 37189  37189       95  1323
#> 120 0.063     1.000  1881    1881   Perquimans 37143  37143       72   484
#> 121 0.044     1.158  1887    1887       Chowan 37041  37041       21   751
#> 122 0.064     1.213  1892    1892        Avery 37011  37011        6   781
#> 123 0.086     1.267  1893    1893       Yadkin 37197  37197       99  1269
#> 124 0.128     1.554  1897    1897     Franklin 37069  37069       35  1399
#> 125 0.108     1.483  1900    1900      Forsyth 37067  37067       34 11858
#> 126 0.170     1.680  1903    1903     Guilford 37081  37081       41 16184
#> 127 0.111     1.392  1904    1904     Alamance 37001  37001        1  4672
#> 128 0.180     2.151  1905    1905       Bertie 37015  37015        8  1324
#> 129 0.104     1.294  1907    1907       Orange 37135  37135       68  3164
#> 130 0.077     1.271  1908    1908       Durham 37063  37063       32  7970
#> 131 0.142     1.640  1913    1913         Nash 37127  37127       64  4021
#> 132 0.059     1.319  1927    1927     Mitchell 37121  37121       61   671
#> 133 0.131     1.521  1928    1928    Edgecombe 37065  37065       33  3657
#> 134 0.122     1.516  1932    1932     Caldwell 37027  37027       14  3609
#> 135 0.080     1.307  1936    1936       Yancey 37199  37199      100   770
#> 136 0.118     1.899  1937    1937       Martin 37117  37117       59  1549
#> 137 0.219     2.130  1938    1938         Wake 37183  37183       92 14484
#> 138 0.118     1.601  1946    1946      Madison 37115  37115       58   765
#> 139 0.155     1.781  1947    1947      Iredell 37097  37097       49  4139
#> 140 0.069     1.201  1948    1948        Davie 37059  37059       30  1207
#> 141 0.066     1.070  1950    1950    Alexander 37003  37003        2  1333
#> 142 0.145     1.791  1951    1951     Davidson 37057  37057       29  5509
#> 143 0.134     1.755  1958    1958        Burke 37023  37023       12  3573
#> 144 0.100     1.331  1962    1962   Washington 37187  37187       94   990
#> 145 0.099     1.411  1963    1963      Tyrrell 37177  37177       89   248
#> 146 0.116     1.664  1964    1964     McDowell 37111  37111       56  1946
#> 147 0.201     1.805  1968    1968     Randolph 37151  37151       76  4456
#> 148 0.180     2.142  1973    1973      Chatham 37037  37037       19  1646
#> 149 0.094     1.307  1979    1979       Wilson 37195  37195       98  3702
#> 150 0.134     1.590  1980    1980        Rowan 37159  37159       80  4606
#> 151 0.168     1.791  1984    1984         Pitt 37147  37147       74  5094
#> 152 0.106     1.444  1986    1986      Catawba 37035  37035       18  5754
#> 153 0.168     1.995  1988    1988     Buncombe 37021  37021       11  7515
#> 154 0.207     1.851  1989    1989     Johnston 37101  37101       51  3999
#> 155 0.144     1.690  1996    1996      Haywood 37087  37087       44  2110
#> 156 0.094     3.640  2000    2000         Dare 37055  37055       28   521
#> 157 0.203     3.197  2004    2004     Beaufort 37013  37013        7  2692
#> 158 0.141     2.316  2013    2013        Swain 37173  37173       87   675
#> 159 0.070     1.105  2016    2016       Greene 37079  37079       40   870
#> 160 0.065     1.093  2026    2026          Lee 37105  37105       53  2252
#> 161 0.146     1.778  2027    2027   Rutherford 37161  37161       81  2992
#> 162 0.142     1.655  2029    2029        Wayne 37191  37191       96  6638
#> 163 0.154     1.680  2030    2030      Harnett 37085  37085       43  3776
#> 164 0.118     1.506  2032    2032    Cleveland 37045  37045       23  4866
#> 165 0.078     1.384  2034    2034      Lincoln 37109  37109       55  2216
#> 166 0.125     1.601  2039    2039      Jackson 37099  37099       50  1143
#> 167 0.181     1.980  2040    2040        Moore 37125  37125       63  2648
#> 168 0.143     1.887  2041    2041  Mecklenburg 37119  37119       60 21588
#> 169 0.091     1.321  2042    2042     Cabarrus 37025  37025       13  4099
#> 170 0.130     1.732  2044    2044   Montgomery 37123  37123       62  1258
#> 171 0.103     1.461  2045    2045       Stanly 37167  37167       84  2356
#> 172 0.095     1.471  2047    2047    Henderson 37089  37089       45  2574
#> 173 0.078     1.202  2056    2056       Graham 37075  37075       38   415
#> 174 0.104     1.548  2065    2065       Lenoir 37107  37107       54  3589
#> 175 0.098     1.389  2067    2067 Transylvania 37175  37175       88  1173
#> 176 0.091     1.470  2068    2068       Gaston 37071  37071       36  9014
#> 177 0.060     1.036  2071    2071         Polk 37149  37149       75   533
#> 178 0.131     1.677  2082    2082        Macon 37113  37113       57   797
#> 179 0.241     2.214  2083    2083      Sampson 37163  37163       82  3025
#> 180 0.082     1.388  2085    2085      Pamlico 37137  37137       69   542
#> 181 0.120     1.686  2088    2088     Cherokee 37039  37039       20  1027
#> 182 0.172     1.835  2090    2090   Cumberland 37051  37051       26 20366
#> 183 0.121     1.978  2091    2091        Jones 37103  37103       52   578
#> 184 0.163     1.716  2095    2095        Union 37179  37179       90  3915
#> 185 0.138     1.621  2096    2096        Anson 37007  37007        4  1570
#> 186 0.098     1.262  2097    2097         Hoke 37093  37093       47  1494
#> 187 0.167     2.709  2099    2099         Hyde 37095  37095       48   338
#> 188 0.204     1.871  2100    2100       Duplin 37061  37061       31  2483
#> 189 0.121     1.855  2107    2107     Richmond 37153  37153       77  2756
#> 190 0.051     1.096  2109    2109         Clay 37043  37043       22   284
#> 191 0.177     2.916  2119    2119       Craven 37049  37049       25  5868
#> 192 0.080     1.188  2123    2123     Scotland 37165  37165       83  2255
#> 193 0.195     1.783  2146    2146       Onslow 37133  37133       67 11158
#> 194 0.240     2.004  2150    2150      Robeson 37155  37155       78  7889
#> 195 0.125     2.868  2156    2156     Carteret 37031  37031       16  2414
#> 196 0.225     2.107  2162    2162       Bladen 37017  37017        9  1782
#> 197 0.214     2.152  2185    2185       Pender 37141  37141       71  1228
#> 198 0.240     2.365  2232    2232     Columbus 37047  37047       24  3350
#> 199 0.042     0.999  2238    2238  New Hanover 37129  37129       65  5526
#> 200 0.212     2.024  2241    2241    Brunswick 37019  37019       10  2181
#>     SID74 NWBIR74 BIR79 SID79 NWBIR79                       geometry
#> 1       1      10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 2       0      10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 3       5     208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 4       1     123   830     2     145 MULTIPOLYGON (((-76.00897 3...
#> 5       9    1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 6       7     954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
#> 7       0     115   350     2     139 MULTIPOLYGON (((-76.00897 3...
#> 8       0     254   594     2     371 MULTIPOLYGON (((-76.56251 3...
#> 9       4     748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 10      1     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...
#> 11      2     550  1253     2     597 MULTIPOLYGON (((-79.53051 3...
#> 12     16    1243  5386     5    1369 MULTIPOLYGON (((-79.53051 3...
#> 13      4     930  2074     4    1058 MULTIPOLYGON (((-78.74912 3...
#> 14      4     613  1790     4     650 MULTIPOLYGON (((-78.8068 36...
#> 15      4    1179  2753     6    1492 MULTIPOLYGON (((-78.49252 3...
#> 16     18    2365  4463    17    2980 MULTIPOLYGON (((-77.33221 3...
#> 17      3     622  2275     4     933 MULTIPOLYGON (((-76.29893 3...
#> 18      4     200  3725     7     222 MULTIPOLYGON (((-81.02057 3...
#> 19      1      17  1775     1      33 MULTIPOLYGON (((-81.80622 3...
#> 20      1     230   676     0     310 MULTIPOLYGON (((-76.48053 3...
#> 21      1     368   899     1     491 MULTIPOLYGON (((-76.68874 3...
#> 22      0       4   977     0       5 MULTIPOLYGON (((-81.94135 3...
#> 23      1      65  1568     1      76 MULTIPOLYGON (((-80.49554 3...
#> 24      2     736  1863     0     950 MULTIPOLYGON (((-78.25455 3...
#> 25     10    3919 15704    18    5031 MULTIPOLYGON (((-80.0381 36...
#> 26     23    5483 20543    38    7089 MULTIPOLYGON (((-79.53782 3...
#> 27     13    1243  5767    11    1397 MULTIPOLYGON (((-79.24619 3...
#> 28      6     921  1616     5    1161 MULTIPOLYGON (((-76.78307 3...
#> 29      4     776  4478     6    1086 MULTIPOLYGON (((-79.01814 3...
#> 30     16    3732 10432    22    4948 MULTIPOLYGON (((-79.01814 3...
#> 31      8    1851  5189     7    2274 MULTIPOLYGON (((-78.18693 3...
#> 32      0       1   919     2       4 MULTIPOLYGON (((-82.11885 3...
#> 33     10    2186  4359     9    2696 MULTIPOLYGON (((-77.67122 3...
#> 34      6     309  4249     9     360 MULTIPOLYGON (((-81.32813 3...
#> 35      0      12   869     1      10 MULTIPOLYGON (((-82.27921 3...
#> 36      2     883  1849     1    1033 MULTIPOLYGON (((-77.17846 3...
#> 37     16    4397 20857    31    6221 MULTIPOLYGON (((-78.92107 3...
#> 38      2       5   926     2       3 MULTIPOLYGON (((-82.89597 3...
#> 39      4    1144  5400     5    1305 MULTIPOLYGON (((-80.72652 3...
#> 40      1     148  1438     3     177 MULTIPOLYGON (((-80.45677 3...
#> 41      0     128  1683     2     150 MULTIPOLYGON (((-81.10889 3...
#> 42      8     736  7143     8     941 MULTIPOLYGON (((-80.06441 3...
#> 43      5     326  4314    15     407 MULTIPOLYGON (((-81.81628 3...
#> 44      5     521  1141     0     651 MULTIPOLYGON (((-76.40843 3...
#> 45      0     116   319     0     141 MULTIPOLYGON (((-76.1673 35...
#> 46      5     134  2215     5     128 MULTIPOLYGON (((-81.81628 3...
#> 47      7     384  5711    12     483 MULTIPOLYGON (((-79.76499 3...
#> 48      2     591  2398     3     687 MULTIPOLYGON (((-79.55536 3...
#> 49     11    1827  4706    13    2330 MULTIPOLYGON (((-78.06533 3...
#> 50      3    1057  6427     8    1504 MULTIPOLYGON (((-80.29824 3...
#> 51     14    2620  6635    11    3059 MULTIPOLYGON (((-77.47388 3...
#> 52      5     790  6883    21     914 MULTIPOLYGON (((-80.96143 3...
#> 53      9     930  9956    18    1206 MULTIPOLYGON (((-82.2581 35...
#> 54      6    1165  4780    13    1349 MULTIPOLYGON (((-78.53874 3...
#> 55      2      57  2463     8      62 MULTIPOLYGON (((-82.74389 3...
#> 56      0      43  1059     1      73 MULTIPOLYGON (((-75.78317 3...
#> 57      7    1131  2909     4    1163 MULTIPOLYGON (((-77.10377 3...
#> 58      3     281   883     2     406 MULTIPOLYGON (((-83.33182 3...
#> 59      4     534  1178     4     664 MULTIPOLYGON (((-77.80518 3...
#> 60      5     736  2949     6     905 MULTIPOLYGON (((-79.18244 3...
#> 61     12     495  3543     8     576 MULTIPOLYGON (((-81.97144 3...
#> 62     18    2593  8227    23    3073 MULTIPOLYGON (((-78.16319 3...
#> 63      6    1051  4789    10    1453 MULTIPOLYGON (((-78.61274 3...
#> 64     10    1491  5526    21    1729 MULTIPOLYGON (((-81.32282 3...
#> 65      8     302  2817     7     350 MULTIPOLYGON (((-80.95677 3...
#> 66      2     215  1504     5     307 MULTIPOLYGON (((-83.10629 3...
#> 67      5     844  3534     5    1151 MULTIPOLYGON (((-79.60747 3...
#> 68     44    8027 30757    35   11631 MULTIPOLYGON (((-81.0493 35...
#> 69      3     856  5669    20    1203 MULTIPOLYGON (((-80.50294 3...
#> 70      3     472  1598     8     588 MULTIPOLYGON (((-80.07141 3...
#> 71      5     370  3039     7     528 MULTIPOLYGON (((-80.07141 3...
#> 72      5     158  3679     8     264 MULTIPOLYGON (((-82.57003 3...
#> 73      0      40   488     1      45 MULTIPOLYGON (((-83.69563 3...
#> 74     10    1826  4225    14    2047 MULTIPOLYGON (((-77.83658 3...
#> 75      3      92  1401     4     104 MULTIPOLYGON (((-82.8877 35...
#> 76     11    1523 11455    26    2194 MULTIPOLYGON (((-81.32282 3...
#> 77      1      95   673     0      79 MULTIPOLYGON (((-82.21017 3...
#> 78      0       9  1157     3      22 MULTIPOLYGON (((-83.10629 3...
#> 79      4    1396  3447     4    1524 MULTIPOLYGON (((-78.11377 3...
#> 80      1     222   631     1     277 MULTIPOLYGON (((-76.94324 3...
#> 81      2      32  1173     1      42 MULTIPOLYGON (((-84.29104 3...
#> 82     38    7043 26370    57   10614 MULTIPOLYGON (((-78.49929 3...
#> 83      1     297   650     2     305 MULTIPOLYGON (((-77.049 34....
#> 84      4    1034  5273     9    1348 MULTIPOLYGON (((-80.84016 3...
#> 85     15     952  1875     4    1161 MULTIPOLYGON (((-79.91995 3...
#> 86      7     987  1706     6    1172 MULTIPOLYGON (((-79.3403 34...
#> 87      0     134   427     0     169 MULTIPOLYGON (((-76.51894 3...
#> 88      4    1061  2777     7    1227 MULTIPOLYGON (((-77.68983 3...
#> 89      4    1043  3108     7    1218 MULTIPOLYGON (((-79.68596 3...
#> 90      0       1   419     0       5 MULTIPOLYGON (((-83.938 34....
#> 91     13    1744  7595    18    2342 MULTIPOLYGON (((-76.89761 3...
#> 92      8    1206  2617    16    1436 MULTIPOLYGON (((-79.45597 3...
#> 93     29    2217 14655    23    3568 MULTIPOLYGON (((-77.53864 3...
#> 94     31    5904  9087    26    6899 MULTIPOLYGON (((-78.86451 3...
#> 95      5     341  3339     4     487 MULTIPOLYGON (((-77.14896 3...
#> 96      8     818  2052     5    1023 MULTIPOLYGON (((-78.2615 34...
#> 97      4     580  1602     3     763 MULTIPOLYGON (((-78.02592 3...
#> 98     15    1431  4144    17    1832 MULTIPOLYGON (((-78.65572 3...
#> 99     12    1633  6917     9    2100 MULTIPOLYGON (((-77.96073 3...
#> 100     5     659  2655     6     841 MULTIPOLYGON (((-78.65572 3...
#> 101     1      10  1364     0      19 MULTIPOLYGON (((-81.47276 3...
#> 102     0      10   542     3      12 MULTIPOLYGON (((-81.23989 3...
#> 103     5     208  3616     6     260 MULTIPOLYGON (((-80.45634 3...
#> 104     1     123   830     2     145 MULTIPOLYGON (((-76.00897 3...
#> 105     9    1066  1606     3    1197 MULTIPOLYGON (((-77.21767 3...
#> 106     7     954  1838     5    1237 MULTIPOLYGON (((-76.74506 3...
#> 107     0     115   350     2     139 MULTIPOLYGON (((-76.00897 3...
#> 108     0     254   594     2     371 MULTIPOLYGON (((-76.56251 3...
#> 109     4     748  1190     2     844 MULTIPOLYGON (((-78.30876 3...
#> 110     1     160  2038     5     176 MULTIPOLYGON (((-80.02567 3...
#> 111     2     550  1253     2     597 MULTIPOLYGON (((-79.53051 3...
#> 112    16    1243  5386     5    1369 MULTIPOLYGON (((-79.53051 3...
#> 113     4     930  2074     4    1058 MULTIPOLYGON (((-78.74912 3...
#> 114     4     613  1790     4     650 MULTIPOLYGON (((-78.8068 36...
#> 115     4    1179  2753     6    1492 MULTIPOLYGON (((-78.49252 3...
#> 116    18    2365  4463    17    2980 MULTIPOLYGON (((-77.33221 3...
#> 117     3     622  2275     4     933 MULTIPOLYGON (((-76.29893 3...
#> 118     4     200  3725     7     222 MULTIPOLYGON (((-81.02057 3...
#> 119     1      17  1775     1      33 MULTIPOLYGON (((-81.80622 3...
#> 120     1     230   676     0     310 MULTIPOLYGON (((-76.48053 3...
#> 121     1     368   899     1     491 MULTIPOLYGON (((-76.68874 3...
#> 122     0       4   977     0       5 MULTIPOLYGON (((-81.94135 3...
#> 123     1      65  1568     1      76 MULTIPOLYGON (((-80.49554 3...
#> 124     2     736  1863     0     950 MULTIPOLYGON (((-78.25455 3...
#> 125    10    3919 15704    18    5031 MULTIPOLYGON (((-80.0381 36...
#> 126    23    5483 20543    38    7089 MULTIPOLYGON (((-79.53782 3...
#> 127    13    1243  5767    11    1397 MULTIPOLYGON (((-79.24619 3...
#> 128     6     921  1616     5    1161 MULTIPOLYGON (((-76.78307 3...
#> 129     4     776  4478     6    1086 MULTIPOLYGON (((-79.01814 3...
#> 130    16    3732 10432    22    4948 MULTIPOLYGON (((-79.01814 3...
#> 131     8    1851  5189     7    2274 MULTIPOLYGON (((-78.18693 3...
#> 132     0       1   919     2       4 MULTIPOLYGON (((-82.11885 3...
#> 133    10    2186  4359     9    2696 MULTIPOLYGON (((-77.67122 3...
#> 134     6     309  4249     9     360 MULTIPOLYGON (((-81.32813 3...
#> 135     0      12   869     1      10 MULTIPOLYGON (((-82.27921 3...
#> 136     2     883  1849     1    1033 MULTIPOLYGON (((-77.17846 3...
#> 137    16    4397 20857    31    6221 MULTIPOLYGON (((-78.92107 3...
#> 138     2       5   926     2       3 MULTIPOLYGON (((-82.89597 3...
#> 139     4    1144  5400     5    1305 MULTIPOLYGON (((-80.72652 3...
#> 140     1     148  1438     3     177 MULTIPOLYGON (((-80.45677 3...
#> 141     0     128  1683     2     150 MULTIPOLYGON (((-81.10889 3...
#> 142     8     736  7143     8     941 MULTIPOLYGON (((-80.06441 3...
#> 143     5     326  4314    15     407 MULTIPOLYGON (((-81.81628 3...
#> 144     5     521  1141     0     651 MULTIPOLYGON (((-76.40843 3...
#> 145     0     116   319     0     141 MULTIPOLYGON (((-76.1673 35...
#> 146     5     134  2215     5     128 MULTIPOLYGON (((-81.81628 3...
#> 147     7     384  5711    12     483 MULTIPOLYGON (((-79.76499 3...
#> 148     2     591  2398     3     687 MULTIPOLYGON (((-79.55536 3...
#> 149    11    1827  4706    13    2330 MULTIPOLYGON (((-78.06533 3...
#> 150     3    1057  6427     8    1504 MULTIPOLYGON (((-80.29824 3...
#> 151    14    2620  6635    11    3059 MULTIPOLYGON (((-77.47388 3...
#> 152     5     790  6883    21     914 MULTIPOLYGON (((-80.96143 3...
#> 153     9     930  9956    18    1206 MULTIPOLYGON (((-82.2581 35...
#> 154     6    1165  4780    13    1349 MULTIPOLYGON (((-78.53874 3...
#> 155     2      57  2463     8      62 MULTIPOLYGON (((-82.74389 3...
#> 156     0      43  1059     1      73 MULTIPOLYGON (((-75.78317 3...
#> 157     7    1131  2909     4    1163 MULTIPOLYGON (((-77.10377 3...
#> 158     3     281   883     2     406 MULTIPOLYGON (((-83.33182 3...
#> 159     4     534  1178     4     664 MULTIPOLYGON (((-77.80518 3...
#> 160     5     736  2949     6     905 MULTIPOLYGON (((-79.18244 3...
#> 161    12     495  3543     8     576 MULTIPOLYGON (((-81.97144 3...
#> 162    18    2593  8227    23    3073 MULTIPOLYGON (((-78.16319 3...
#> 163     6    1051  4789    10    1453 MULTIPOLYGON (((-78.61274 3...
#> 164    10    1491  5526    21    1729 MULTIPOLYGON (((-81.32282 3...
#> 165     8     302  2817     7     350 MULTIPOLYGON (((-80.95677 3...
#> 166     2     215  1504     5     307 MULTIPOLYGON (((-83.10629 3...
#> 167     5     844  3534     5    1151 MULTIPOLYGON (((-79.60747 3...
#> 168    44    8027 30757    35   11631 MULTIPOLYGON (((-81.0493 35...
#> 169     3     856  5669    20    1203 MULTIPOLYGON (((-80.50294 3...
#> 170     3     472  1598     8     588 MULTIPOLYGON (((-80.07141 3...
#> 171     5     370  3039     7     528 MULTIPOLYGON (((-80.07141 3...
#> 172     5     158  3679     8     264 MULTIPOLYGON (((-82.57003 3...
#> 173     0      40   488     1      45 MULTIPOLYGON (((-83.69563 3...
#> 174    10    1826  4225    14    2047 MULTIPOLYGON (((-77.83658 3...
#> 175     3      92  1401     4     104 MULTIPOLYGON (((-82.8877 35...
#> 176    11    1523 11455    26    2194 MULTIPOLYGON (((-81.32282 3...
#> 177     1      95   673     0      79 MULTIPOLYGON (((-82.21017 3...
#> 178     0       9  1157     3      22 MULTIPOLYGON (((-83.10629 3...
#> 179     4    1396  3447     4    1524 MULTIPOLYGON (((-78.11377 3...
#> 180     1     222   631     1     277 MULTIPOLYGON (((-76.94324 3...
#> 181     2      32  1173     1      42 MULTIPOLYGON (((-84.29104 3...
#> 182    38    7043 26370    57   10614 MULTIPOLYGON (((-78.49929 3...
#> 183     1     297   650     2     305 MULTIPOLYGON (((-77.049 34....
#> 184     4    1034  5273     9    1348 MULTIPOLYGON (((-80.84016 3...
#> 185    15     952  1875     4    1161 MULTIPOLYGON (((-79.91995 3...
#> 186     7     987  1706     6    1172 MULTIPOLYGON (((-79.3403 34...
#> 187     0     134   427     0     169 MULTIPOLYGON (((-76.51894 3...
#> 188     4    1061  2777     7    1227 MULTIPOLYGON (((-77.68983 3...
#> 189     4    1043  3108     7    1218 MULTIPOLYGON (((-79.68596 3...
#> 190     0       1   419     0       5 MULTIPOLYGON (((-83.938 34....
#> 191    13    1744  7595    18    2342 MULTIPOLYGON (((-76.89761 3...
#> 192     8    1206  2617    16    1436 MULTIPOLYGON (((-79.45597 3...
#> 193    29    2217 14655    23    3568 MULTIPOLYGON (((-77.53864 3...
#> 194    31    5904  9087    26    6899 MULTIPOLYGON (((-78.86451 3...
#> 195     5     341  3339     4     487 MULTIPOLYGON (((-77.14896 3...
#> 196     8     818  2052     5    1023 MULTIPOLYGON (((-78.2615 34...
#> 197     4     580  1602     3     763 MULTIPOLYGON (((-78.02592 3...
#> 198    15    1431  4144    17    1832 MULTIPOLYGON (((-78.65572 3...
#> 199    12    1633  6917     9    2100 MULTIPOLYGON (((-77.96073 3...
#> 200     5     659  2655     6     841 MULTIPOLYGON (((-78.65572 3...
#>     SID_increase
#> 1             NA
#> 2             NA
#> 3             NA
#> 4             NA
#> 5             NA
#> 6             NA
#> 7             NA
#> 8             NA
#> 9             NA
#> 10            NA
#> 11            NA
#> 12            NA
#> 13            NA
#> 14            NA
#> 15            NA
#> 16            NA
#> 17            NA
#> 18            NA
#> 19            NA
#> 20            NA
#> 21            NA
#> 22            NA
#> 23            NA
#> 24            NA
#> 25            NA
#> 26            NA
#> 27            NA
#> 28            NA
#> 29            NA
#> 30            NA
#> 31            NA
#> 32            NA
#> 33            NA
#> 34            NA
#> 35            NA
#> 36            NA
#> 37            NA
#> 38            NA
#> 39            NA
#> 40            NA
#> 41            NA
#> 42            NA
#> 43            NA
#> 44            NA
#> 45            NA
#> 46            NA
#> 47            NA
#> 48            NA
#> 49            NA
#> 50            NA
#> 51            NA
#> 52            NA
#> 53            NA
#> 54            NA
#> 55            NA
#> 56            NA
#> 57            NA
#> 58            NA
#> 59            NA
#> 60            NA
#> 61            NA
#> 62            NA
#> 63            NA
#> 64            NA
#> 65            NA
#> 66            NA
#> 67            NA
#> 68            NA
#> 69            NA
#> 70            NA
#> 71            NA
#> 72            NA
#> 73            NA
#> 74            NA
#> 75            NA
#> 76            NA
#> 77            NA
#> 78            NA
#> 79            NA
#> 80            NA
#> 81            NA
#> 82            NA
#> 83            NA
#> 84            NA
#> 85            NA
#> 86            NA
#> 87            NA
#> 88            NA
#> 89            NA
#> 90            NA
#> 91            NA
#> 92            NA
#> 93            NA
#> 94            NA
#> 95            NA
#> 96            NA
#> 97            NA
#> 98            NA
#> 99            NA
#> 100           NA
#> 101        FALSE
#> 102         TRUE
#> 103         TRUE
#> 104         TRUE
#> 105        FALSE
#> 106        FALSE
#> 107         TRUE
#> 108         TRUE
#> 109        FALSE
#> 110         TRUE
#> 111        FALSE
#> 112        FALSE
#> 113        FALSE
#> 114        FALSE
#> 115         TRUE
#> 116        FALSE
#> 117         TRUE
#> 118         TRUE
#> 119        FALSE
#> 120        FALSE
#> 121        FALSE
#> 122        FALSE
#> 123        FALSE
#> 124        FALSE
#> 125         TRUE
#> 126         TRUE
#> 127        FALSE
#> 128        FALSE
#> 129         TRUE
#> 130         TRUE
#> 131        FALSE
#> 132         TRUE
#> 133        FALSE
#> 134         TRUE
#> 135         TRUE
#> 136        FALSE
#> 137         TRUE
#> 138        FALSE
#> 139         TRUE
#> 140         TRUE
#> 141         TRUE
#> 142        FALSE
#> 143         TRUE
#> 144        FALSE
#> 145        FALSE
#> 146        FALSE
#> 147         TRUE
#> 148         TRUE
#> 149         TRUE
#> 150         TRUE
#> 151        FALSE
#> 152         TRUE
#> 153         TRUE
#> 154         TRUE
#> 155         TRUE
#> 156         TRUE
#> 157        FALSE
#> 158        FALSE
#> 159        FALSE
#> 160         TRUE
#> 161        FALSE
#> 162         TRUE
#> 163         TRUE
#> 164         TRUE
#> 165        FALSE
#> 166         TRUE
#> 167        FALSE
#> 168        FALSE
#> 169         TRUE
#> 170         TRUE
#> 171         TRUE
#> 172         TRUE
#> 173         TRUE
#> 174         TRUE
#> 175         TRUE
#> 176         TRUE
#> 177        FALSE
#> 178         TRUE
#> 179        FALSE
#> 180        FALSE
#> 181        FALSE
#> 182         TRUE
#> 183         TRUE
#> 184         TRUE
#> 185        FALSE
#> 186        FALSE
#> 187        FALSE
#> 188         TRUE
#> 189         TRUE
#> 190        FALSE
#> 191         TRUE
#> 192         TRUE
#> 193        FALSE
#> 194        FALSE
#> 195        FALSE
#> 196        FALSE
#> 197        FALSE
#> 198         TRUE
#> 199        FALSE
#> 200         TRUE

st_as_sf(list_rbind(list(nc, nc_modified)))
#> Simple feature collection with 200 features and 15 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID        NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 1  0.114     1.442  1825    1825        Ashe 37009  37009        5  1091     1
#> 2  0.061     1.231  1827    1827   Alleghany 37005  37005        3   487     0
#> 3  0.143     1.630  1828    1828       Surry 37171  37171       86  3188     5
#> 4  0.070     2.968  1831    1831   Currituck 37053  37053       27   508     1
#> 5  0.153     2.206  1832    1832 Northampton 37131  37131       66  1421     9
#> 6  0.097     1.670  1833    1833    Hertford 37091  37091       46  1452     7
#> 7  0.062     1.547  1834    1834      Camden 37029  37029       15   286     0
#> 8  0.091     1.284  1835    1835       Gates 37073  37073       37   420     0
#> 9  0.118     1.421  1836    1836      Warren 37185  37185       93   968     4
#> 10 0.124     1.428  1837    1837      Stokes 37169  37169       85  1612     1
#>    NWBIR74 BIR79 SID79 NWBIR79 SID_increase                       geometry
#> 1       10  1364     0      19           NA MULTIPOLYGON (((-81.47276 3...
#> 2       10   542     3      12           NA MULTIPOLYGON (((-81.23989 3...
#> 3      208  3616     6     260           NA MULTIPOLYGON (((-80.45634 3...
#> 4      123   830     2     145           NA MULTIPOLYGON (((-76.00897 3...
#> 5     1066  1606     3    1197           NA MULTIPOLYGON (((-77.21767 3...
#> 6      954  1838     5    1237           NA MULTIPOLYGON (((-76.74506 3...
#> 7      115   350     2     139           NA MULTIPOLYGON (((-76.00897 3...
#> 8      254   594     2     371           NA MULTIPOLYGON (((-76.56251 3...
#> 9      748  1190     2     844           NA MULTIPOLYGON (((-78.30876 3...
#> 10     160  2038     5     176           NA MULTIPOLYGON (((-80.02567 3...

Created on 2023-12-15 with reprex v2.0.2

library(sf)
library(tidyverse)
# 2023-12-15
# Notes to add to https://geocompr.r-universe.dev/articles/geocompkg/tidyverse-pitfalls.html
nc = st_read(system.file("shape/nc.shp", package="sf"))
nc_modified = nc |>
mutate(
SID_increase = SID79 > SID74
)
# ---- select
# select always returns a sf object
select(nc, SID74)
# select returns a 0 fields sf object when selecting the sfc column
select(nc, geometry)
# ---- filter
# filter can work with geometry column
nc |>
filter(
st_geometry_type(geometry) == "POINT"
)
# Binary predicates return matrices which will generate a warning message even if it is one column
nc |>
filter(
st_is_within_distance(geometry, nc[1, ], dist = units::set_units(300000, "m"), sparse = FALSE)
)
# Use as.logical to avoid passing a one-column matrix as a filter predicate
nc |>
filter(
as.logical(st_is_within_distance(geometry, nc[1, ], dist = units::set_units(300000, "m"), sparse = FALSE))
)
# discussion on performance issues w/ filter https://github.com/r-spatial/sf/issues/1889
# ---- mutate
# Geometric unary operations st_ functions work inside of mutate
nc |>
mutate(
geometry = st_centroid(geometry)
)
# Computing geometric measurements works inside of mutate
nc |>
mutate(
dist = st_distance(st_centroid(geometry), nc[1, ])
)
# ---- summarise
# summarise looks like it supports the .by parameter but geometry for both groups are identical
# open issue: https://github.com/r-spatial/sf/issues/2207
nc_modified_by <- nc_modified |>
summarise(
.by = SID_increase
)
# compared to group_by method
nc_modified_group_by <- nc_modified |>
group_by(SID_increase) |>
summarise()
# maps to show differences
nc_modified_by |>
ggplot() +
geom_sf(aes(fill = SID_increase))
nc_modified_group_by |>
ggplot() +
geom_sf(aes(fill = SID_increase))
# ---- joins
# you can't use left_join, full_join, or right_join if both x and y are sf objects
withCallingHandlers(
nc |>
left_join(
nc_modified
),
error = function(cnd) {
print(cnd$message)
}
)
# Dropping geometry from y
nc |>
left_join(
st_drop_geometry(nc_modified)
)
# Dropping geometry from x and using geometry from y
nc |>
st_drop_geometry() |>
# NOTE: This method can create empty geometries
left_join(nc_modified) |>
st_as_sf()
# ---- rename
# rename works with geometry columns
rename(
nc,
geom = geometry
)
# rename is the same as this
st_set_geometry(nc, "geom")
# ---- distinct
# distinct with a geometry column returns an sf object
nc |>
distinct(geometry)
# distinct with an attibute column returns a data frame
nc |>
distinct(SID74)
# distinct with an attribute column and .keep_all = TRUE returns a data frame
nc |>
distinct(SID74, .keep_all = TRUE)
# inconsistency discussed in this GitHub issue https://github.com/r-spatial/sf/issues/1477
# ---- binding functions
# bind_rows always returns a sf object if x input is an sf object
bind_rows(nc, nc_modified)
# bind_rows is superseded but not deprecated
# https://github.com/r-spatial/sf/issues/2157
# list_rbind always returns a data frame that needs to be converted back into a sf object
list_rbind(list(nc, nc_modified))
st_as_sf(list_rbind(list(nc, nc_modified)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment