sf
sf copied to clipboard
mutate(.keep = "none") and mutate(.keep = "used") error with sf object
Describe the bug
1. transmute(<sf-object>, ...)
vs. mutate(<sf-object>, ..., .keep = "none")
The documentation of transmute()
says:
It's superseded because you can perform the same job with
mutate(.keep = "none")
.
However mutate(<sf-object>, ..., .keep = "none")
errors, while it is expected to give the same result as transmute()
.
Notes:
- The geometry column should be sticky in
mutate()
, as intransmute()
. -
bind_cols()
seems to work around the error, but looses the geometry; this may hint at what's happening.
2. mutate(<sf-object>, ..., .keep = "used")
mutate(<sf-object>, ..., .keep = "used")
returns the same error.
I'd think in both cases the sticky nature of the geometry column is not preserved / respected, leading to the error.
To Reproduce
library(dplyr, warn.conflicts = FALSE)
library(sf)
#> Linking to GEOS 3.11.1, GDAL 3.6.4, PROJ 9.1.1; sf_use_s2() is TRUE
sf_extSoftVersion()
#> GEOS GDAL proj.4 GDAL_with_GEOS USE_PROJ_H
#> "3.11.1" "3.6.4" "9.1.1" "true" "true"
#> PROJ
#> "9.1.1"
g <- st_sfc(st_point(1:2), st_point(3:4))
s <- st_sf(a = 3:4, b = 1:2, geometry = g)
s
#> Simple feature collection with 2 features and 2 fields
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 1 ymin: 2 xmax: 3 ymax: 4
#> CRS: NA
#> a b geometry
#> 1 3 1 POINT (1 2)
#> 2 4 2 POINT (3 4)
# both should be the same: ------------------------------------
transmute(s, c = a * 2)
#> Simple feature collection with 2 features and 1 field
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 1 ymin: 2 xmax: 3 ymax: 4
#> CRS: NA
#> c geometry
#> 1 6 POINT (1 2)
#> 2 8 POINT (3 4)
mutate(s, c = a * 2, .keep = "none")
#> Error in st_geometry.sf(x): attr(obj, "sf_column") does not point to a geometry column.
#> Did you rename it, without setting st_geometry(obj) <- "newname"?
# strangely the following works, BUT drops geometry: ----------
mutate(s, c = a * 2, .keep = "none") |>
bind_cols()
#> c
#> 1 6
#> 2 8
# also errors: ------------------------------------------------
mutate(s, c = a * 2, .keep = "used")
#> Error in st_geometry.sf(x): attr(obj, "sf_column") does not point to a geometry column.
#> Did you rename it, without setting st_geometry(obj) <- "newname"?
# these are no problem: ---------------------------------------
mutate(s, c = a * 2, .keep = "unused")
#> Simple feature collection with 2 features and 2 fields
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 1 ymin: 2 xmax: 3 ymax: 4
#> CRS: NA
#> b geometry c
#> 1 1 POINT (1 2) 6
#> 2 2 POINT (3 4) 8
mutate(s, c = a * 2, .keep = "all")
#> Simple feature collection with 2 features and 3 fields
#> Geometry type: POINT
#> Dimension: XY
#> Bounding box: xmin: 1 ymin: 2 xmax: 3 ymax: 4
#> CRS: NA
#> a b geometry c
#> 1 3 1 POINT (1 2) 6
#> 2 4 2 POINT (3 4) 8
Created on 2024-01-31 with reprex v2.1.0
Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#> setting value
#> version R version 4.3.2 (2023-10-31)
#> os Linux Mint 21.3
#> system x86_64, linux-gnu
#> ui X11
#> language nl_BE:nl
#> collate nl_BE.UTF-8
#> ctype nl_BE.UTF-8
#> tz Europe/Brussels
#> date 2024-01-31
#> pandoc 3.1.1 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> class 7.3-22 2023-05-03 [3] RSPM (R 4.2.0)
#> classInt 0.4-10 2023-09-05 [3] RSPM (R 4.3.0)
#> cli 3.6.2 2023-12-11 [3] RSPM (R 4.3.0)
#> DBI 1.2.1 2024-01-12 [3] RSPM (R 4.3.0)
#> digest 0.6.34 2024-01-11 [3] RSPM (R 4.3.0)
#> dplyr * 1.1.4 2023-11-17 [3] RSPM (R 4.3.0)
#> e1071 1.7-14 2023-12-06 [3] RSPM (R 4.3.0)
#> evaluate 0.23 2023-11-01 [3] RSPM (R 4.3.0)
#> fansi 1.0.6 2023-12-08 [3] RSPM (R 4.3.0)
#> fastmap 1.1.1 2023-02-24 [3] RSPM (R 4.2.0)
#> fs 1.6.3 2023-07-20 [3] RSPM (R 4.2.0)
#> generics 0.1.3 2022-07-05 [3] RSPM (R 4.2.0)
#> glue 1.7.0 2024-01-09 [3] RSPM (R 4.3.0)
#> htmltools 0.5.7 2023-11-03 [3] RSPM (R 4.3.0)
#> KernSmooth 2.23-22 2023-07-10 [3] RSPM (R 4.2.0)
#> knitr 1.45 2023-10-30 [3] RSPM (R 4.3.0)
#> lifecycle 1.0.4 2023-11-07 [3] RSPM (R 4.3.0)
#> magrittr 2.0.3 2022-03-30 [3] RSPM (R 4.2.0)
#> pillar 1.9.0 2023-03-22 [3] RSPM (R 4.2.0)
#> pkgconfig 2.0.3 2019-09-22 [3] CRAN (R 4.0.1)
#> proxy 0.4-27 2022-06-09 [3] RSPM (R 4.2.0)
#> purrr 1.0.2 2023-08-10 [3] RSPM (R 4.2.0)
#> R.cache 0.16.0 2022-07-21 [3] RSPM (R 4.2.0)
#> R.methodsS3 1.8.2 2022-06-13 [3] RSPM (R 4.2.0)
#> R.oo 1.26.0 2024-01-24 [3] RSPM (R 4.3.0)
#> R.utils 2.12.3 2023-11-18 [3] RSPM (R 4.3.0)
#> R6 2.5.1 2021-08-19 [3] RSPM (R 4.2.0)
#> Rcpp 1.0.12 2024-01-09 [3] RSPM (R 4.3.0)
#> reprex 2.1.0 2024-01-11 [3] RSPM (R 4.3.0)
#> rlang 1.1.3 2024-01-10 [3] RSPM (R 4.3.0)
#> rmarkdown 2.25 2023-09-18 [3] RSPM (R 4.3.0)
#> rstudioapi 0.15.0 2023-07-07 [3] RSPM (R 4.2.0)
#> sessioninfo 1.2.2 2021-12-06 [3] RSPM (R 4.2.0)
#> sf * 1.0-15 2023-12-18 [1] CRAN (R 4.3.2)
#> styler 1.10.2 2023-08-29 [3] RSPM (R 4.2.0)
#> tibble 3.2.1 2023-03-20 [3] RSPM (R 4.3.0)
#> tidyselect 1.2.0 2022-10-10 [3] RSPM (R 4.2.0)
#> units 0.8-5 2023-11-28 [3] RSPM (R 4.3.0)
#> utf8 1.2.4 2023-10-22 [3] RSPM (R 4.3.0)
#> vctrs 0.6.5 2023-12-01 [3] RSPM (R 4.3.0)
#> withr 3.0.0 2024-01-16 [3] RSPM (R 4.3.2)
#> xfun 0.41 2023-11-01 [3] RSPM (R 4.3.0)
#> yaml 2.3.8 2023-12-11 [3] RSPM (R 4.3.0)
#>
#> [1] /home/floris/lib/R/library
#> [2] /usr/local/lib/R/site-library
#> [3] /usr/lib/R/site-library
#> [4] /usr/lib/R/library
#>
#> ──────────────────────────────────────────────────────────────────────────────
Thanks, FYI,
bind_cols() seems to work around the error, but looses the geometry; this may hint at what's happening.
bind_cols()
is a function, not a method, so there's little we can do about that here.