Jak usunąć część struny? Na przykład w ATGAS_1121
Chcę usunąć wszystko wcześniej _
.
Odpowiedzi:
Używaj wyrażeń regularnych. W takim przypadku możesz użyć gsub
:
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
To wyrażenie regularne dopasowuje początek ciągu (^), dowolny znak (.) Powtórzony zero lub więcej razy (*) i podkreślenie (_). The? sprawia, że dopasowanie jest „leniwe”, tak że tylko dopasowania znajdują się na pierwszym miejscu podkreślenia. To dopasowanie jest zastępowane tylko podkreśleniem. Zobacz ?regex
więcej szczegółów i referencji
Możesz użyć do tego wbudowanego, strsplit :
> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1
[1] "1121"
strsplit zwraca oba fragmenty ciągu przeanalizowane w parametrze split jako listę . To nie to, co chcesz chyba, aby owinąć połączenie w wyświetlać na liście , a następnie indeks że tablica tak, że tylko drugi z tych dwóch elementów w wektorze są zwracane.
Na koniec parametr ustalony powinien mieć wartość TRUE, aby wskazać, że parametr split nie jest wyrażeniem regularnym, ale literalnym pasującym znakiem.
Jeśli jesteś osobą typu Tidyverse, oto rozwiązanie typu stringr :
R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"
Oto strsplit
rozwiązanie, jeśli s
jest wektorem:
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
Być może najbardziej intuicyjnym rozwiązaniem jest prawdopodobnie skorzystanie z stringr
funkcji, str_remove
która jest nawet łatwiejsza niż str_replace
ponieważ ma tylko 1 argument zamiast 2.
Jedyną trudną częścią twojego przykładu jest to, że chcesz zachować podkreślenie, ale jest to możliwe: musisz dopasować wyrażenie regularne, dopóki nie znajdzie określonego wzorca ciągu (?=pattern)
.
Zobacz przykład:
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")
[1] "_1121" "_1432" "_1121"
Tutaj strsplit
rozwiązanie dla ramki danych wykorzystującej dplyr
pakiet
col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
col2 = c("T", "M", "A")
df = data.frame(col1, col2)
df
col1 col2
1 TGAS_1121 T
2 MGAS_1432 M
3 ATGAS_1121 A
df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2
col1 col2
1 1121 T
2 1432 M
3 1121 A
gsub("^.*_","_","ATGAS_1121_xxx")
. , . Teraz naprawione.