Отфильтруйте значения в переменной в кадре данных, которые соответствуют регулярному выражению, используя grep в R - PullRequest
0 голосов
/ 24 июня 2019

У меня есть данные, которые выглядят так:

data <- data.frame(
  ID_num = c("BGR9876", "BNG3421", "GTH4567", "YOP9824", "Child 1", "2JAZZ", "TYH7654"),
  date_created = "19/07/1983"
)

Я бы хотел отфильтровать кадр данных, чтобы я сохранил только те строки, где ID_num следует шаблону ABC1234.Я новичок в использовании регулярных выражений в grep, и я ошибаюсь.Это то, что я пытаюсь

data_clean <- data %>%
  filter(grep("[A-Z]{3}[1:9]{4}", ID_num))

Что дает мне ошибку Error in filter_impl(.data, quo) : Argument 2 filter condition does not evaluate to a logical vector

Это мой желаемый вывод

data_clean <- data.frame(
  ID_num = c("BGR9876", "BNG3421", "GTH4567", "YOP9824", "TYH7654"),
  date_created = "19/07/1983"
)

Спасибо

Ответы [ 2 ]

3 голосов
/ 24 июня 2019

Мы можем использовать grepl с рисунком

data[grepl("[A-Z]{3}\\d{4}", data$ID_num), ]

#   ID_num date_created
#1 BGR9876   19/07/1983
#2 BNG3421   19/07/1983
#3 GTH4567   19/07/1983
#4 YOP9824   19/07/1983
#7 TYH7654   19/07/1983

Или в filter

library(dplyr)
data %>% filter(grepl("[A-Z]{3}\\d{4}", ID_num))
3 голосов
/ 24 июня 2019

1:9 должно быть 1-9, и будет grepl вместе с ^ для указания начала строки и $ для конца строки

library(dplyr)
data %>%
   filter(grepl("^[A-Z]{3}[1-9]{4}$", ID_num))
#   ID_num date_created
#1 BGR9876   19/07/1983
#2 BNG3421   19/07/1983
#3 GTH4567   19/07/1983
#4 YOP9824   19/07/1983
#5 TYH7654   19/07/1983

filter ожидает логический вектор, grep возвращает числовой индекс, а grepl возвращает логический вектор


Или, если мы хотим использовать grep, используйте slice, который ожидает числовой индекс

data %>%
   slice(grep("^[A-Z]{3}[1-9]{4}$", ID_num))

Аналогичная опция в tidyverse будет использовать str_detect

library(stringr)
data %>%
    filter(str_detect(ID_num, "^[A-Z]{3}[1-9]{4}$"))

В base R мы можем сделать

subset(data, grepl("^[A-Z]{3}[1-9]{4}$", ID_num))

или с Extract

data[grepl("^[A-Z]{3}[1-9]{4}$", data$ID_num),]

Обратите внимание, что это определенно найдет комбинацию из 3 букв в верхнем регистре, за которыми следуют 4 цифры, и они не будут совпадать

grepl("[A-Z]{3}[1-9]{4}", "ABGR9876923")
#[1] TRUE

grepl("^[A-Z]{3}[1-9]{4}$", "ABGR9876923")
#[1] FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...