2015-05-12 17 views
7

Mam wektor znaków t w następujący sposób.Wyodrębnij wiele wystąpień wzorca z ciągu znaków w R

t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
    "GID895 GID895 K350") 

Chciałbym wyodrębnić wszystkie ciągi rozpoczynające się od GID, a następnie sekwencję cyfr.

Działa, ale nie pobiera wielu wystąpień.

gsub(".*(GID\\d+).*", "\\1", t) 
[1] "GID456" "GID667" "GID2345" "GID895" 

Jak wyodrębnić wszystkie ciągi w tym przypadku? Sygnał wyjściowy jest następujący

out <- c("GID456", "GID456", "GID667", "GID45345", "GID2345", 
     "GID895", "GID895") 

Odpowiedz

10

Oto podejście przy użyciu pakietu utrzymuję qdapRegex (wolę to albo Stringi/stringr) oprzeć na spójności i łatwości użytkowania. Pokażę również podejście bazowe. W każdym razie patrzę na to bardziej jako na "ekstrakcję" niż na problem z podporządkowaniem.

y <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
    "GID895 GID895 K350") 

library(qdapRegex) 
unlist(ex_default(y, pattern = "GID\\d+")) 

## [1] "GID456" "GID456" "GID667" "GID45345" "GID2345" "GID895" "GID895" 

bazy R:

unlist(regmatches(y, gregexpr("GID\\d+", y))) 
1

I stosuje str_split funkcji z pakietu

library(stringr) 
word.list = str_split(t, '\\s+') 
new_list <- unlist(word.list) 
new_list[grep("GID", new_list)] 

nadzieję, że to pomaga stringr.

3

Poprzez gsub

> t <- c("GID456 SPK711", "GID456 GID667 VINK", "GID45345 DNP990 GID2345", 
+  "GID895 GID895 K350") 
> unlist(strsplit(gsub("(GID\\d+)|.", "\\1 ", t), "\\s+")) 
[1] "GID456" "GID456" "GID667" "GID45345" "GID2345" 
[6] "GID895" "GID895" 
Powiązane problemy