如何在 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
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