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