Menu

Strings em R: paste, sprintf, gsub, substr e Mais

Tudo o que você precisa para texto em R: criar strings, juntar com paste e paste0, formatar com sprintf e pesquisar com gsub, grepl e strsplit.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Criando Strings em R

Uma string em R é texto entre aspas. Aspas duplas e simples funcionam e significam exatamente a mesma coisa; a convenção é usar aspas duplas, trocando para simples quando o próprio texto contém aspas duplas:

Os escapes com barra invertida funcionam como na maioria das linguagens: \" para aspas literais, \n para nova linha, \t para tabulação, \\ para a própria barra invertida.

Agora o erro que todo iniciante em R comete exatamente uma vez: perguntar o tamanho de uma string com length().

nchar() conta caracteres - 5. length() conta elementos do vetor, e uma string sozinha é um vetor de um elemento - então ele diz 1. Em R tudo é um vetor, inclusive texto, e todas as funções desta página funcionam discretamente elemento a elemento em vetores de character inteiros. Isso é um recurso, assim que você para de se surpreender com ele.

Juntando Strings: paste() e paste0()

R não tem + para strings. A concatenação é feita com paste(), que junta seus argumentos com um espaço por padrão, e paste0(), que junta sem nada:

Como o paste é vetorizado, dar a ele um vetor constrói várias strings de uma vez - é assim que você gera nomes de arquivo, rótulos e IDs em uma linha:

E o argumento collapse faz o oposto: ele funde um vetor inteiro em uma única string com o separador escolhido:

Lembre a divisão: sep controla a cola entre argumentos, collapse a cola entre os elementos de um vetor. Você pode usar ambos na mesma chamada.

Formatando com sprintf()

Quando você precisa de números formatados dentro de texto - casas decimais fixas, larguras com preenchimento - paste() fica sem fôlego e sprintf() assume. Ele usa códigos de formato no estilo C: %s para strings, %d para números inteiros, %f para decimais:

%.1f significa "uma casa decimal", %.3f três, e %05d preenche com zeros até cinco dígitos. Um %% duplicado produz um sinal de porcentagem literal. sprintf() também é vetorizado, então pode formatar uma coluna inteira de valores em uma chamada - veja entrada e saída para o padrão de relatórios com sprintf() + cat().

Mudando o Caso e Fatiando: toupper(), tolower(), substr()

A conversão de caixa é exatamente o que o nome diz:

tolower() se paga normalizando dados bagunçados antes de uma comparação - "Yes", "YES" e "yes" viram todos o mesmo valor.

substr(x, start, stop) extrai uma fatia por posição de caractere, contando a partir de 1 (R é indexado em 1 em todo lugar):

Ambas as extremidades são inclusivas: as posições 1 a 11 dão "Programming".

Buscar e Substituir: sub(), gsub() e grepl()

sub() substitui a primeira ocorrência de um padrão; gsub() ("global substitute") substitui todas:

Um detalhe crítico: o padrão é uma expressão regular por padrão, não texto literal. Caracteres de regex como ., *, ( e ? têm significados especiais - um . sozinho casa com qualquer caractere. Quando você quer dizer o texto literal, passe fixed = TRUE:

A primeira linha dá a-b-c; a segunda dá -----, porque como regex o . casou com cada um dos caracteres. Até você aprender regex, faça de fixed = TRUE seu padrão e nunca será mordido.

grepl() não substitui - ele testa se cada elemento casa com o padrão, retornando um vetor logical. Isso o torna a ferramenta padrão para filtrar texto:

O primeiro resultado marca quais nomes de arquivo contêm .csv; o segundo usa esse vetor logical para manter apenas os que casam.

Dividindo e Aparando: strsplit() e trimws()

strsplit() corta uma string em pedaços com base em um separador. Sua única peculiaridade: ele retorna uma lista, porque pode dividir várias strings de uma vez. Para uma única string, pegue o primeiro elemento com [[1]]:

E trimws() remove os espaços em branco que os dados do mundo real sempre trazem de brinde:

Por padrão, ele apara as duas pontas; which = "left" ou "right" apara apenas um lado (os nomes se referem ao início e ao fim da string).

A Alternativa stringr

Tudo acima é R base - sempre disponível, sem instalação. O pacote stringr do tidyverse embrulha as mesmas operações em um esquema de nomes consistente str_* com a string sempre como primeiro argumento, o que muitas pessoas acham mais fácil de lembrar (veja pacotes para instalá-lo):

library(stringr)

str_detect(files, "csv")            # like grepl(), data first
str_replace_all(s, "good", "great") # like gsub(), arguments reordered
str_length("hello")                 # like nchar()

As funções de string do R base valem a pena conhecer de qualquer forma - você vai encontrá-las em todo script, resposta do Stack Overflow e mensagem de erro já escritos. Aprenda os nomes do base primeiro; adote o stringr quando as ordens inconsistentes de argumentos começarem a incomodar.

O Que Você Leva Daqui

  • Strings usam aspas duplas por convenção; nchar() conta caracteres, length() conta elementos do vetor.
  • Concatene com paste() / paste0(); sep cola argumentos, collapse cola um vetor em uma string.
  • sprintf() cuida da saída formatada: %s, %d, %.2f.
  • sub() substitui a primeira ocorrência, gsub() todas, grepl() testa ocorrências - todos usam regex por padrão, então passe fixed = TRUE para texto literal.
  • strsplit() retorna uma lista (pegue o [[1]]); trimws() limpa entradas com espaços extras.

A seguir: colocar texto para dentro e para fora dos seus programas - imprimir com print() e cat(), e ler entrada do usuário.

Perguntas frequentes

Como concatenar strings em R?

Com paste() ou paste0() - R não tem + para strings. paste("data", "science")"data science" (separado por espaço por padrão); paste0("data", "science") junta sem nada. Use sep = para mudar o separador e collapse = para fundir um vetor inteiro em uma única string.

Como obter o comprimento de uma string em R?

nchar("hello") retorna 5, o número de caracteres. length("hello") retorna 1 - em R, length() conta elementos de um vetor, e uma string sozinha é um vetor de um elemento. Confundir length() com nchar() é o erro clássico de iniciante.

Qual é a diferença entre sub() e gsub() em R?

Ambos buscam e substituem, mas sub() substitui apenas a primeira ocorrência, enquanto gsub() ("global sub") substitui todas. Ambos tratam o padrão como expressão regular por padrão - passe fixed = TRUE para casar o texto literal.

Como dividir uma string em R?

strsplit(x, split) divide com base em um padrão, mas retorna uma lista (porque pode dividir várias strings de uma vez). Para uma única string, pegue o primeiro elemento: strsplit("a,b,c", ",")[[1]] dá o vetor de character "a" "b" "c".

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR