У меня есть большой 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 не работает в этом случае.