Mam wektor, który ma elementy charakteru

"2-CONTROL", "DAN-COLOR", "3M", "DIPLOMVEJ 373", "ABE 34 HUN"

Chciałbym filtrować elementy elementy, które mają niezależne numery w ciągu sznurka. Jeśli numer jest dołączony do alfabetów lub łącznika, nie należy go filtrowany.

Powyższy wektor podaje poniższy wynik po filtrowaniu.

"2-CONTROL", "DAN-COLOR", "3M"

Próbowałem użyć "\\b\\d+\\b" w GREPL, ale także filtry "2-CONTROL"

r
2
JGG 2 czerwiec 2018, 00:23

3 odpowiedzi

Najlepsza odpowiedź

1) Wymień każdą postać, która nie jest cyfrą, a nie białe znaki X, a następnie użyj wyrażenia regularnego:

pat <- "\\b\\d+\\b" # from question

x[!grepl(pat, gsub("[^[:space:][:digit:]]", "X", x))]
## [1] "2-CONTROL" "DAN-COLOR" "3M"

2) Inną możliwością jest podział na białe znaki i odrzucić dowolny element wszystkich cyfr.

x[sapply(strsplit(x, "\\s+"), function(x) !any(grepl("^\\d+$", x)))]
## [1] "2-CONTROL" "DAN-COLOR" "3M"  
2
G. Grothendieck 1 czerwiec 2018, 22:02

Dla podejścia tidyverse użyj stringr::str_detect():

library(stringr)

strings <- c("2-CONTROL", "DAN-COLOR", "3M", "DIPLOMVEJ 373", "ABE 34 HUN")
pattern <- " \\d+ ?" # match free-standing integers

strings[!str_detect(strings, pattern)]
# [1] "2-CONTROL" "DAN-COLOR" "3M" 
0
andrew_reece 1 czerwiec 2018, 22:21

Logika negacji wydaje się pracować:

regexp <- "\\d{2,}"

x <- c("2-CONTROL", "DAN-COLOR", "3M", "DIPLOMVEJ 373", "ABE 34 HUN")
res <- x[!grepl(regexp, x)]
res
# "2-CONTROL" "DAN-COLOR" "3M"  
-1
Bulat 3 czerwiec 2018, 09:28