Substituir caracteres específicos nas cadeias

262

Gostaria de remover caracteres específicos de seqüências de caracteres dentro de um vetor, semelhante ao recurso Localizar e substituir no Excel.

Aqui estão os dados com os quais começo:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Eu começo com apenas a primeira coluna; Eu quero produzir a segunda coluna removendo o e's:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947
Lucas
fonte

Respostas:

399

Com uma expressão regular e a função gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

O que gsubfaz aqui é substituir cada ocorrência de "e"por uma sequência vazia "".


Veja ?regexpou gsubpara obter mais ajuda.

Andrie
fonte
15
fixed = TRUEtornaria isso mais rápido.
Rich Scriven
4
@RichScriven, você poderia explicar em breve por quê?
precisa
6
fixed=TRUEimpede que R use expressões regulares, que permitem uma correspondência de padrões mais flexível, mas levam tempo para calcular. Se tudo o que for necessário for remover uma única cadeia constante "e", elas não serão necessárias.
mm689
Teria sub("e", "", group)o mesmo resultado?
Matheus Santana
seria apenas substituir a primeira eque encontra em cada elemento
sindri_baldur
47

Expressões regulares são seus amigos:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Agora use gsub()com o padrão de substituição possível mais simples: string vazia:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 
Dirk Eddelbuettel
fonte
3
Também ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa 13/08/2012
26
Bem, eu poderia rir que "aqueles que não entendem as funções básicas estão condenados a substituí-las". Exatamente o que o stringr ganha aqui, além de aumentar o número de sublinhados no seu arquivo de origem?
Dirk Eddelbuettel 13/08/2012
8
" stringr é um conjunto de wrappers simples que tornam as funções de string de R mais consistentes, mais simples e fáceis de usar " do autor do pacote. Portanto, se o que você diz é verdadeiro (muitos sublinhados para agrupar as funções básicas ...), não há razão para que este pacote exista (aviso de isenção de responsabilidade: eu uso principalmente funções básicas de regex, mas sei que elas podem ser difíceis para novos usuários ... )
dickoa 13/08/2012
17
@dickoa: str_replacewraps sub, portanto substituirá apenas a primeira ocorrência do padrão. Você precisaria usar str_replace_allse quisesse o mesmo comportamento que gsub.
13132 Joshua Ulrich
24

Resumindo 2 maneiras de substituir seqüências de caracteres:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Use gsub

group$group.no.e <- gsub("e", "", group$group)

2) Use o stringrpacote

group$group.no.e <- str_replace_all(group$group, "e", "")

Ambos produzirão o resultado desejado:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947
Megatron
fonte
3
Na época, você tinha que ler a página inteira, incluindo comentários, para aprender a sintaxe do stringr, meu método preferido, como era discutido principalmente nos comentários. Essa solução apresenta rapidamente as duas opções, e foi por isso que a ofereci. Minha esperança era ajudar outros usuários a filtrarem o que eu tinha que fazer quando eu era novo na R. Eu lutei com o gsub antes de encontrar o stringr porque ele não foi mencionado em uma resposta altamente votada. Novamente, o objetivo não é coletar votos positivos, mas tentar ajudar novos usuários de R.
Megatron
Se você encontrar informações em outras respostas / comentários que achar úteis e que gostaria de converter em uma resposta, você poderia pelo menos fornecer algumas atribuições para mostrar de onde você obteve essas informações / tornar a resposta um Wiki do Comminuty em vez de apenas fazê-lo como seu próprio.
precisa saber é o seguinte
Obrigado - lembre-se da próxima vez. Nunca criou um wiki da comunidade antes, então não sabia que era uma opção.
Megatron
1
A opção 2 funciona muito bem quando aplicada a uma coluna de dados em um quadro de dados, sem especificar todos os valores na coluna. Obviamente, a opção 1 é uma repetição, mas a opção 2 funciona muito bem e merece um voto positivo pela funcionalidade adicionada.
Phil_T 02/09
6

Você não precisa criar um quadro de dados a partir do vetor de cadeias, se desejar substituir alguns caracteres. Expressões regulares é uma boa opção, pois já foi mencionado por @Andrie e @Dirk Eddelbuettel.

Preste atenção, se você deseja substituir caracteres especiais, como pontos, deve empregar sintaxe de expressão regular completa, como mostrado no exemplo abaixo:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

isso produzirá

[1] "Czech Republic" "New Zealand"    "Great Britain" 
Alexander
fonte
Você pode simplesmente escapar deles, mas você tem que escapar, bem como o caractere de escape porque é entre aspas:gsub("\\.", " ", ctr_names)
Kamil S Jaron
4

Use o pacote stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"
MERose
fonte
0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
Anya Sti
fonte