Выберите все, кроме строк со знаком плюс регулярное выражение

#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 :