【问题标题】:Removing row in R based on a "typeof" list column基于“typeof”列表列删除 R 中的行
【发布时间】:2020-04-07 01:30:39
【问题描述】:

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

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

我正在考虑将typeof“列表”变成“字符串”并像这样删除它???有什么建议吗?

# 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

【问题讨论】:

    标签: r shapefile typeof


    【解决方案1】:

    这里是map/filter 的一个选项,我们用map 循环遍历list 列'geometry,检查是否不是all 值是NaN,返回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, ., )
    

    【讨论】:

    • 你的第一个和第二个答案给了我一个错误,上面写着:Error in data.matrix(data): (list) object cannot be coerced to type 'double',但第三个有效!
    • @Zman3 ii 试图创建一个。可重现的示例,但不能,因此没有正确测试
    猜你喜欢
    • 2016-12-02
    • 2021-01-31
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多