7 votos

La aplicación del filtro con el paquete sf no funciona

Pregunta:
Tengo un objeto sf en R y quiero seleccionar algunos polígonos según su nombre de ubicación. Me gustaría aplicar el enfoque dpylr utilizando la función de filtro (análogo a este ejemplo ). Sin embargo, esto no funciona y devuelve un mensaje de error.

¿Se trata de un error, hay un problema con los datos o hay algo mal en el código?

Ejemplo:

> wards %>%
+  filter(NAME_WARD == "Bumbuta")
Error in data.matrix(data) : 
  (list) object cannot be coerced to type 'double'
In addition: Warning messages:
1: In data.matrix(data) : NAs introduced by coercion
2: In data.matrix(data) : NAs introduced by coercion
3: In data.matrix(data) : NAs introduced by coercion

Datos:

> wards
Simple feature collection with 5 features and 6 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 35.82647 ymin: -4.968201 xmax: 36.3376 ymax: -4.55612
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs 
   NAME_REG NAME_DIST NAME_WARD ID_REG ID_DIST ID_WARD                       geometry
1    Dodoma    Kondoa   Bumbuta     01    0101 0101011 MULTIPOLYGON (((35.93715495...
2    Dodoma    Kondoa      Pahi     01    0101 0101021 MULTIPOLYGON (((35.93456275...
3    Dodoma    Kondoa     Haubi     01    0101 0101041 MULTIPOLYGON (((35.92014452...
4    Dodoma    Kondoa   Kalamba     01    0101 0101051 MULTIPOLYGON (((35.88398049...
5    Dodoma    Kondoa   Kwadelo     01    0101 0101061 MULTIPOLYGON (((36.33663165...

> str(wards)
Classes ‘sf’ and 'data.frame':  5 obs. of  7 variables:
 $ NAME_REG : chr  "Dodoma" "Dodoma" "Dodoma" "Dodoma" ...
 $ NAME_DIST: chr  "Kondoa" "Kondoa" "Kondoa" "Kondoa" ...
 $ NAME_WARD: chr  "Bumbuta" "Pahi" "Haubi" "Kalamba" ...
 $ ID_REG   : chr  "01" "01" "01" "01" ...
 $ ID_DIST  : chr  "0101" "0101" "0101" "0101" ...
 $ ID_WARD  : chr  "0101011" "0101021" "0101041" "0101051" ...
 $ geometry :sfc_MULTIPOLYGON of length 5; first list element: List of 1
  ..$ :List of 1
  .. ..$ : num [1:200, 1:2] 35.9 35.9 35.9 35.9 35.9 ...
  ..- attr(*, "class")= chr  "XY" "MULTIPOLYGON" "sfg"
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA
  ..- attr(*, "names")= chr  "NAME_REG" "NAME_DIST" "NAME_WARD" "ID_REG" ...

14voto

Jay Bazuzi Puntos 194

No ha adjuntado el dplyr paquete:

> e %>% filter(ADMIN_NAME=="Durham")
Error in data.matrix(data) : 
  (list) object cannot be coerced to type 'double'

Cuando lo hagas, verás que dplyr pisa la base R filter con su propia función filter función:

> library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    **filter**, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Y luego funciona:

> e %>% filter(ADMIN_NAME=="Durham")
Simple feature collection with 1 feature and 7 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -6.359723 ymin: 49.89083 xmax: 1.771111 ymax: 55.80611
epsg (SRID):    NA
proj4string:    NA
  ADMIN_NAME  AREA PERIMETER ADMIN2_ ADMIN2_ID  GMI_ADMIN2 COUNTRY
1     Durham 0.335     3.147      18        18 GBR-ENG-DRH England
                        geometry
1 MULTIPOLYGON(((-2.305007934...

Una forma mejor es ser explícito sobre dónde filter viene de:

> e %>% dplyr::filter(ADMIN_NAME=="Durham")
Simple feature collection with 1 feature and 7 fields
geometry type:  MULTIPOLYGON

entonces cualquier código que tenga que utilice la base R filter no se romperá misteriosamente porque dplyr se adjunta.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X