我正在尝试使用R中的sf包,并使用st_within
函数查看sf对象是否在另一个sf对象内部。我的问题在于这个函数的输出是稀疏几何二元谓词-sgbp
,我需要一个向量作为输出,以便之后可以使用dplyr
包进行过滤。以下是一个简化的示例:
# object 1: I will test if it is inside object 2
df <- data.frame(lon = c(2.5, 3, 3.5), lat = c(2.5, 3, 3.5), var = 1) %>%
st_as_sf(coords = c("lon", "lat"), dim = "XY") %>% st_set_crs(4326) %>%
summarise(var = sum(var), do_union = F) %>% st_cast("LINESTRING")
# object 2: I will test if it contains object 1
box <- data.frame(lon = c(2, 4, 4, 2, 2), lat = c(2, 2, 4, 4,2), var = 1) %>%
st_as_sf(coords = c("lon", "lat"), dim = "XY") %>% st_set_crs(4326) %>%
summarise(var = sum(var), do_union = F) %>% st_cast("POLYGON")
# test 1
df$indicator <- st_within(df$geometry, box$geometry) # gives geometric binary predicate on pairs of sf sets which cannot be used
df <- df %>% filter(indicator == 1)
这会报错:错误:列 indicator
必须是一维原子向量或列表。
我尝试以下方法解决此问题:
# test 2
df$indicator <- st_within(df$geometry, box$geometry, sparse = F) %>%
diag() # gives matrix that I convert with diag() into vector
df <- df %>% filter(indicator == FALSE)
这个方法可以移除包含TRUE值的行,但是由于我的真实数据包含很多观测值,所以制作矩阵的过程非常缓慢。有没有一种方法可以将st_within
的输出变成字符向量,或者可能有一种方法可以将sgbp
转换为与dplyr
兼容的字符向量而不制作矩阵?
st_within
或可能从另一个函数输出逻辑或字符向量。 - adl