#r #regex #stringr #regex-negation
Вопрос:
Предположим, у меня есть следующий фрейм данных в R:
df <- tribble(
~id, ~key,
1, " 999..3762962",
2, "0677219-30911",
3, "-739812//3918",
4, " 273$8279838",
5, "1904-03940538",
6, NA
)
Я хочу отфильтровать каждую строку, в которой нет знака плюс.
Согласно правилам регулярных выражений, с помощью «[^…]» я должен иметь возможность исключить любой символ, который я хочу. Однако, когда пытаешься что-то вроде:
library(tidyverse)
df %>%
filter(str_detect(key, "[^\ ]"))
Это не работает, и в конечном итоге фильтруется все, кроме пропущенных значений (это исключает 6-ю строку).
Что я здесь делаю не так? Я пытался искать подобные вопросы, но они требуют очень специфического выбора с регулярным выражением, поэтому полученный код/предложение практически неразборчиво для меня. Я считаю, что ответ на этот вопрос очень прост.
Спасибо.
Ответ №1:
Мы могли бы либо найти наличие
символа в строке с str_detect
и указать negate = TRUE
(из @thelatemail) (здесь |
с is.na
— делается для возврата строк с пропущенными значениями — по умолчанию filter
удаляет эти NA
строки)
library(dplyr)
library(stringr)
df %>%
filter(str_detect(key, fixed(' '), negate = TRUE)|is.na(key))
# A tibble: 4 x 2
# id key
# <dbl> <chr>
#1 2 0677219-30911
#2 3 -739812//3918
#3 5 1904-03940538
#4 6 <NA>
Или, если мы используем код операции, обязательно укажите начало ( ^
) и $
строку, т. е. один или несколько символов, которые не являются
( [^ ]
) от начала ( ^
) до конца ( $
) строки
df %>%
filter(str_detect(key, '^[^ ]
Комментарии:
1. Спасибо! Я искал твой второй ответ. Я не знал, что мне нужно было использовать хотя бы " ^ [ ^ ]", чтобы отфильтровать знак плюс в начале
2.
str_detect
также естьnegate=
аргумент -df %>% filter(str_detect(key, "\ ", negate=TRUE))
3. @caproki проблема в вашем коде заключается
[^\ ]
в том, что он соответствует любому из символов, которые не являются a, и возвращает значение TRUE во всех случаях, кроме
NA
Ответ №2:
Базовая версия R с grep
:
df[grep(' ', df$key, fixed = TRUE, invert = TRUE),]
# id key
# <dbl> <chr>
#1 2 0677219-30911
#2 3 -739812//3918
#3 5 1904-03940538
#4 6 NA
)|is.na(key))
# A tibble: 4 x 2
# id key
# <dbl> <chr>
#1 2 0677219-30911
#2 3 -739812//3918
#3 5 1904-03940538
#4 6 <NA>
Комментарии:
1. Спасибо! Я искал твой второй ответ. Я не знал, что мне нужно было использовать хотя бы » ^ [ ^ ]», чтобы отфильтровать знак плюс в начале
2.
str_detect
также естьnegate=
аргумент —df %>% filter(str_detect(key, "\ ", negate=TRUE))
3. @caproki проблема в вашем коде заключается
[^\ ]
в том, что он соответствует любому из символов, которые не являются a, и возвращает значение TRUE во всех случаях, кроме
NA
Ответ №2:
Базовая версия R с grep
: