Return 只有来自 osm 搜索的非缺失值
Return only non-missing values from osm search
我正在尝试获取从 osmdata 返回的非 na 值。例如,以电子邮件地址为例。但是,以下 returns 大部分都丢失了电子邮件。我如何设置查询,使其 returns 只有非缺失值... value = "!null"
也不起作用。
library(osmdata)
san <- opq(bbox = 'San Jose, California') %>%
add_osm_feature(key = 'email') %>%
osmdata_sf()
df <- san$osm_points
nrow(df)
sum(!is.na(df$email))
osmdata
包遵循与 Open Street Map 数据本身相同的层次结构。如果您进一步查看数据,您会看到以下内容:
library (osmdata)
#> Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
san <- opq(bbox = 'San Jose, California') %>%
add_osm_feature(key = 'email') %>%
osmdata_sf()
df <- san$osm_points
nrow(df)
#> [1] 738
sum(!is.na(df$email))
#> [1] 39
length (which (is.na (san$osm_multipolygons$email)))
#> [1] 0
length (which (is.na (san$osm_polygons$email)))
#> [1] 3
length (which (is.na (san$osm_points$email)))
#> [1] 699
osm_multipolygons
是层次结构中的 highest-level 个对象,它们都有电子邮件地址。其中每一个还包含许多多边形,并非所有多边形都必须有电子邮件地址,因此有 3 个没有电子邮件的多边形。默认情况下,点列表(无论是在 OSM 本身还是 osmdata
中)都包含属于每个 higher-level 对象的每个点,因此不可避免地包含很多没有电子邮件地址的点。因此,您无法仅针对每个类别中没有缺失值的对象发出查询(请参阅 repo issue#221 中的更多信息)。
您想要的结果仍然可以通过 unique_osmdata()
function 获得,它将每种不同类型的对象减少到只有原始调用中请求的那些唯一值。这应该给你你想要的:
san_unique <- unique_osmdata (san)
length (which (is.na (san_unique$osm_multipolygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_polygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_points$email)))
#> [1] 0
san_unique <- unique_osmdata (san)
san_unique
#> Object of class 'osmdata' with:
#> $bbox : 37.124503,-122.045672,37.4692175,-121.589153
#> $overpass_call : The call submitted to the overpass API
#> $meta : metadata including timestamp and version numbers
#> $osm_points : 'sf' Simple Features Collection with 39 points
#> $osm_polygons : 'sf' Simple Features Collection with 36 polygons
#> $osm_multilines : NULL
#> $osm_multipolygons : 'sf' Simple Features Collection with 1 multipolygons
length (which (is.na (san_unique$osm_multipolygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_polygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_points$email)))
#> [1] 0
我正在尝试获取从 osmdata 返回的非 na 值。例如,以电子邮件地址为例。但是,以下 returns 大部分都丢失了电子邮件。我如何设置查询,使其 returns 只有非缺失值... value = "!null"
也不起作用。
library(osmdata)
san <- opq(bbox = 'San Jose, California') %>%
add_osm_feature(key = 'email') %>%
osmdata_sf()
df <- san$osm_points
nrow(df)
sum(!is.na(df$email))
osmdata
包遵循与 Open Street Map 数据本身相同的层次结构。如果您进一步查看数据,您会看到以下内容:
library (osmdata)
#> Data (c) OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright
san <- opq(bbox = 'San Jose, California') %>%
add_osm_feature(key = 'email') %>%
osmdata_sf()
df <- san$osm_points
nrow(df)
#> [1] 738
sum(!is.na(df$email))
#> [1] 39
length (which (is.na (san$osm_multipolygons$email)))
#> [1] 0
length (which (is.na (san$osm_polygons$email)))
#> [1] 3
length (which (is.na (san$osm_points$email)))
#> [1] 699
osm_multipolygons
是层次结构中的 highest-level 个对象,它们都有电子邮件地址。其中每一个还包含许多多边形,并非所有多边形都必须有电子邮件地址,因此有 3 个没有电子邮件的多边形。默认情况下,点列表(无论是在 OSM 本身还是 osmdata
中)都包含属于每个 higher-level 对象的每个点,因此不可避免地包含很多没有电子邮件地址的点。因此,您无法仅针对每个类别中没有缺失值的对象发出查询(请参阅 repo issue#221 中的更多信息)。
您想要的结果仍然可以通过 unique_osmdata()
function 获得,它将每种不同类型的对象减少到只有原始调用中请求的那些唯一值。这应该给你你想要的:
san_unique <- unique_osmdata (san)
length (which (is.na (san_unique$osm_multipolygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_polygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_points$email)))
#> [1] 0
san_unique <- unique_osmdata (san)
san_unique
#> Object of class 'osmdata' with:
#> $bbox : 37.124503,-122.045672,37.4692175,-121.589153
#> $overpass_call : The call submitted to the overpass API
#> $meta : metadata including timestamp and version numbers
#> $osm_points : 'sf' Simple Features Collection with 39 points
#> $osm_polygons : 'sf' Simple Features Collection with 36 polygons
#> $osm_multilines : NULL
#> $osm_multipolygons : 'sf' Simple Features Collection with 1 multipolygons
length (which (is.na (san_unique$osm_multipolygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_polygons$email)))
#> [1] 0
length (which (is.na (san_unique$osm_points$email)))
#> [1] 0