Удаление строки в R на основе столбца списка «typeof» - PullRequest
1 голос
/ 07 апреля 2020

Я просмотрел несколько других решений о том, как удалить строку на основе значения столбца, но не смог сделать это для «списка» typeof. Следующий тиббл - это шейп-файл, созданный для обучения классификации. Чтобы растеризовать шейп-файл, мне нужно удалить строки, которые не содержат геометрических данных. то есть строка 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

1 Ответ

2 голосов
/ 07 апреля 2020

Вот один вариант с map/filter, где мы l oop над геометрией list столбца с map, проверим, нет ли 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, ., )
...