根据 "typeof" 列表列删除 R 中的行

Removing row in R based on a "typeof" list column

我查看了其他一些关于如何根据列值删除行的解决方案,但无法针对 "list" typeof 执行此操作。以下 tibble 是为分类训练构建的 shapefile。要栅格化 shapefile,我需要删除不包含几何数据的行。即第 8 行。我可以简单地执行 df <- df$geometry[-8, ],但这对于大型数据集来说效率很低。

几何列在 R 数据框中的读取也有点不同(出于某种原因,这是 tibble 函数输出的内容)。几何列应该用 c 读取(如矢量)。即 c(-123.1166, 44.67333)。所以 EMPTY 实际上是 c(NaN, NaN)

我正在考虑将 typeof "list" 变成 "string" 然后删除它???有什么建议吗?

# A tibble: 102 x 3
   Class Names2             geometry
   <dbl> <fct>           <POINT [°]>
 1     1 Hole   (-123.1166 44.67333)
 2     1 Hole   (-123.1166 44.67333)
 3     1 Hole   (-123.1166 44.67332)
 4     1 Hole    (-123.1167 44.6734)
 5     1 Hole    (-123.1167 44.6734)
 6     1 Hole   (-123.1166 44.67344)
 7     1 Hole   (-123.1165 44.67358)
 8     1 Hole                  EMPTY
 9     1 Hole   (-123.1167 44.67367)
10     1 Hole   (-123.1167 44.67367)
# ... with 92 more rows

这是 map/filter 的一个选项,我们用 map 遍历 list 列几何,检查是否 all 值为 NaN,到 return filter 中的逻辑向量,以删除所有 NaN

library(dplyr)
library(purrr)
df1 %>%
      filter(map_lgl(geometry, ~ !all(is.nan(.x)))

如果是sf对象,一个选项是st_is_empty

library(sf)
df1 %>% 
    filter(!st_is_empty(geometry)]

也可能是

df1 %>%
     st_is_empty(.) %>%
     `!` %>%
     magrittr::extract(df1, ., )