Remova parte de uma corda


90

Como faço para remover parte de uma corda? Por exemplo, em ATGAS_1121Desejo remover tudo antes _.

Respostas:


133

Use expressões regulares. Nesse caso, você pode usar gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

Esta expressão regular corresponde ao início da string (^), qualquer caractere (.) Repetido zero ou mais vezes (*) e sublinhado (_). O ? torna a correspondência "preguiçosa", de forma que apenas as correspondências estejam no primeiro sublinhado. Essa correspondência é substituída por apenas um sublinhado. Veja ?regexpara mais detalhes e referências


6
A regex anterior corresponderia ao último sublinhado no caso de, por exemplo gsub("^.*_","_","ATGAS_1121_xxx"),. Agora corrigido.
Richie Cotton

7
@Joshua Acho muito útil que você tenha explicado o papel das expressões regulares.
Vasile

Isso também funciona com um vetor de strings como último argumento. R é incrível assim.
naught101

37

Você pode usar um integrado para isso, strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit retorna ambas as partes da string analisadas no parâmetro de divisão como uma lista . Provavelmente não é isso que você deseja, então envolva a chamada em unlist e indexe essa matriz de modo que apenas o segundo dos dois elementos do vetor seja retornado.

Finalmente, o parâmetro fixo deve ser definido como TRUE para indicar que o parâmetro de divisão não é uma expressão regular, mas um caractere de correspondência literal.


23

Se você é o tipo de pessoa do Tidyverse , esta é a solução de 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"

21

Aqui está a strsplitsolução se sfor um vetor:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
Muito útil, obrigado! Para sua informação, para obter a primeira parte da string (ou seja, antes de '_'), substitua o [2] no final por um [1].
stevenjoe

4

Talvez a solução mais intuitiva seja provavelmente usar a stringrfunção, str_removeque é ainda mais fácil do que str_replace, pois tem apenas 1 argumento em vez de 2.

A única parte complicada em seu exemplo é que você deseja manter o sublinhado, mas é possível: você deve corresponder à expressão regular até que ela encontre o padrão de string especificado (?=pattern).

Consultar exemplo:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

Aqui, a strsplitsolução para um dataframe usando o dplyrpacote

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.