如何在 R 中的 sf 对象中应用条件?

How to apply a condition in sf object in R?

Assuming this data here

library(sf)
fname <- system.file("shape/nc.shp", package="sf")
nc <- st_read(fname)

如果几何纬度 > 32 且 < 33,则将 NAME 中所有对应的“Ashe”重命名为“new”

我想,如果我理解正确的话,那么您想要 select 行的 sf 数据框基于几何列中存在的 co-ordinates。在 32 度到 33 度之间的特定数据框中没有对象,正如我们在下图中看到的那样:

ggplot(nc) + geom_sf()

让我们 select 几何完全在 35 和 36 范围内的行。

in_range <- vapply(nc$geometry, function(x) {
  lat <- as.matrix(x)[,2]
  all(lat > 35 & lat < 36)
}, logical(1))

nc$NAME[in_range] <- "new"

ggplot(nc, aes(fill = NAME == "new")) + geom_sf()


编辑

要根据几何是否在范围内加上其他条件来更改NAME,您可以将nc视为普通R数据框。

library(sf)
#> Linking to GEOS 3.9.1, GDAL 3.2.1, PROJ 7.2.1; sf_use_s2() is TRUE
fname <- system.file("shape/nc.shp", package="sf")
nc <- st_read(fname)

in_range <- vapply(nc$geometry, function(x) {
  lat <- as.matrix(x)[,2]
  all(lat > 35 & lat < 36)
}, logical(1))

nc$NAME[in_range & nc$NAME == "McDowell"] <- "new"

因此,现在任何几何图形在范围内且 NAME 为“McDowell”的行都将其 NAME 更改为“新”。我们可以这样证明:

nc[in_range,]
#> Simple feature collection with 35 features and 14 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: -84.03086 ymin: 35.00028 xmax: -75.7637 ymax: 35.99465
#> Geodetic CRS:  NAD27
#> First 10 features:
#>     AREA PERIMETER CNTY_ CNTY_ID       NAME  FIPS FIPSNO CRESS_ID BIR74 SID74
#> 43 0.134     1.755  1958    1958      Burke 37023  37023       12  3573     5
#> 44 0.100     1.331  1962    1962 Washington 37187  37187       94   990     5
#> 45 0.099     1.411  1963    1963    Tyrrell 37177  37177       89   248     0
#> 46 0.116     1.664  1964    1964        new 37111  37111       56  1946     5
#> 47 0.201     1.805  1968    1968   Randolph 37151  37151       76  4456     7
#> 48 0.180     2.142  1973    1973    Chatham 37037  37037       19  1646     2
#> 49 0.094     1.307  1979    1979     Wilson 37195  37195       98  3702    11
#> 50 0.134     1.590  1980    1980      Rowan 37159  37159       80  4606     3
#> 51 0.168     1.791  1984    1984       Pitt 37147  37147       74  5094    14
#> 52 0.106     1.444  1986    1986    Catawba 37035  37035       18  5754     5
#>    NWBIR74 BIR79 SID79 NWBIR79                       geometry
#> 43     326  4314    15     407 MULTIPOLYGON (((-81.81628 3...
#> 44     521  1141     0     651 MULTIPOLYGON (((-76.40843 3...
#> 45     116   319     0     141 MULTIPOLYGON (((-76.1673 35...
#> 46     134  2215     5     128 MULTIPOLYGON (((-81.81628 3...
#> 47     384  5711    12     483 MULTIPOLYGON (((-79.76499 3...
#> 48     591  2398     3     687 MULTIPOLYGON (((-79.55536 3...
#> 49    1827  4706    13    2330 MULTIPOLYGON (((-78.06533 3...
#> 50    1057  6427     8    1504 MULTIPOLYGON (((-80.29824 3...
#> 51    2620  6635    11    3059 MULTIPOLYGON (((-77.47388 3...
#> 52     790  6883    21     914 MULTIPOLYGON (((-80.96143 3...

reprex package (v2.0.1)

创建于 2022-04-02