Нечеткое использование предикатов any_vars и all_vars при фильтрации строк по столбцам с несколькими значениями с использованием отрицательного str_detect - PullRequest
0 голосов
/ 16 января 2020

Я строю сеть:

from <- c("America, port unspecified", "Boston", "Chicago", "America, port unspecified")
to <-  c("Europe, port unspecified", "Nantes", "Le Havre", "Lisbonn")

dataset <- data.frame(from, to)

library(dplyr)

Я хочу создать подмножество своего набора данных со строками, НЕ содержащими неопределенные порты:

     from       to
     Boston     Nantes
     Chicago    Le Havre

Я пробовал это: в приведенном ниже коде я ' m ищет строку «порт не указан» во всех столбцах. Я хочу сохранить строки, где строка «порт не указан» не присутствует ни в одной из переменных.

dataset2 <- dataset %>%
              filter_all(any_vars(!str_detect(., "port unspecified")))

Результат:

 from   to
Boston  Nantes
Chicago Le Havre
America, port unspecified   Lisbonn

Я попробовал код ниже с успехом:

dataset3 <- dataset %>%
    filter_all(all_vars(!str_detect(., "port unspecified")))

Результат:

from  to
Boston  Nantes
Chicago Le Havre

Почему all_vars дает мне ожидаемый результат, а не any_vars?

Ответы [ 2 ]

2 голосов
/ 16 января 2020
library(dplyr)
dataset %>% filter_all(any_vars(!str_detect(., "port unspecified")))

Это читается как выбранные строки, где "port unspecified" отсутствует в any столбца, который является строкой 2, 3, 4.

, тогда как этот

dataset %>% filter_all(all_vars(!str_detect(., "port unspecified")))

означает выбор строк, в которых "port unspecified" отсутствует в all столбцов, являющихся строками 2 и 3.

Надеюсь, это достаточно ясно для понимания.

1 голос
/ 16 января 2020

Используя базу R, вы также можете получить эквивалентный результат:

from <- c("America, port unspecified", "Boston", "Chicago", "America, port unspecified")
to <-  c("Europe, port unspecified", "Nantes", "Le Havre", "Lisbonn")

dataset <- data.frame(from, to)

# Loop through each column cand check for any port unspecified
semi <- lapply(dataset, grepl, pattern = "port unspecified")

# check which rows have a port unspecified (`pmax`) and exclude them with `!`.
dataset[!do.call(pmax, semi), ]
#>      from       to
#> 2  Boston   Nantes
#> 3 Chicago Le Havre
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...