! str_detect (col, pattern) удаляет больше строк из data.frame, чем найдено с помощью str_detect (col, pattern) - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть большой data.frame / tibble с несколькими символьными столбцами, и я нахожусь в процессе очистки данных там. Один столбец содержит названия городов. Иногда строка не содержит названия города (т. Е. Город - это "", или Город также может быть NA). Иногда города помечаются символом градуса (то есть «°» или «\ u00B0»).

Пример ситуации с использованием tidyverse / dplyr и stringr:

nrow(df) #5000
df.degree <- df %>% filter(str_detect(city, '\u00B0')) 
nrow(df.degree) #30
df.withoutdegree <- df %>% filter(!str_detect(city, '\u00B0'))
nrow(df.withoutdegree) #4500

Моя цель - удалить только 30 строк, которые содержат символ градуса в столбце города. Если я смотрю на эти строки, я получаю их, используя filter и str_detect. Отрицание str_detect удаляет намного больше строк, чем только эти 30.

Кажется, это тот случай, когда я пропустил какую-то очевидную документацию или параметр, который мне нужно установить, или другой подход, который мне не хватает. Тем не менее, я не могу найти это. Можете ли вы указать мне правильное направление?

Любые подсказки с примерами кода для того, чтобы сделать это еще более элегантным (может быть, с помощью "contains ()"?), Также очень ценятся.

Спасибо! :)

PS: Следующее прекрасно работает:

df.withoutdegree <- df %>% filter(!(grepl('\u00B0', city, ignore.case = TRUE)))
nrow(df.withoutdegree) #4970

Однако мне труднее читать код для пиров, и мне, как правило, интересно узнать, почему отрицание str_detect не работает в этом случае.

1 Ответ

0 голосов
/ 25 апреля 2018

Если целью является удаление значений \u00B0, то это должно сработать:

df <- df %>% filter(!str_detect(city, '\\\u00B0'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...