super_banner_728x90

segunda-feira, 5 de dezembro de 2011

Como concatenar strings no R (como o join, no Python)

Tentando concatenar elementos de um vetor de strings (character) de forma a criar uma só string, deparei-me com a função paste.

A documentação do R mostra o seguinte, para a função:

------------------------------------------------------

Description

Concatenate vectors after converting to character.

Usage

paste(..., sep = " ", collapse = NULL)

Arguments

...one or more R objects, to be converted to character vectors.
sepa character string to separate the terms. Not NA_character_.
collapsean optional character string to separate the results. Not NA_character_.



------------------------------------------------------

Mesmo com a descrição, talvez ainda cause confusão a diferença exata entre os argumentos sep e collapse.

No exemplo da documentação, é mostrado o comando


paste("A", 1:6, sep = "")


que gera o seguinte resultado:


[1] "A1" "A2" "A3" "A4" "A5" "A6"


De forma parecida, o comando


paste("A", 1:6, sep = "_")


gera o resultado:



[1] "A_1" "A_2" "A_3" "A_4" "A_5" "A_6"



O problema é que eu gostaria de unir todos os elementos de um vetor em uma string só, como o comando join faz no Python.

Exemplo (em Python):
>>> x = ['1', '2', '3', '4', '5', '6']
>>> print 'bla'.join(x)
1bla2bla3bla4bla5bla6

Ou seja, o join une os termos de x separando-os pela string passada (no caso, 'bla').

Para fazer de maneira semelhante, com o paste, você deve usar o argumento collapse, e não o sep.
A principal diferença é que o sep é um separador usado na concatenação de cada termo. Já o collapse serve para unir todos os termos.

Veja a diferença:

> paste("A", 1:6, sep = '*')
[1] "A*1" "A*2" "A*3" "A*4" "A*5" "A*6"
> paste("A", 1:6, collapse = '*')
[1] "A 1*A 2*A 3*A 4*A 5*A 6"

Dessa forma, para fazer o paste ter a mesma função do join, use o collapse, e não o sep.


É isso. Espero que o post ajude!