我试图在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
兼容的字符向量?
请您参考如下方法:
这是从稀疏几何二进制谓词中获取逻辑向量的方法:
df$indicator <- st_within(df, box) %>% lengths > 0
或子集而不创建新变量:
df <- df[st_within(df, box) %>% lengths > 0,]
不幸的是,我无法对您的大型数据集进行测试,但是请告诉我它是否比矩阵方法要快。