337 votes

Concaténer un vecteur de chaînes de caractères

Si j'ai un vecteur de type caractère, comment puis-je concaténer les valeurs en une chaîne de caractères? Voici comment je le ferais avec paste() :

sdata = c('a', 'b', 'c')
paste(sdata[1], sdata[2], sdata[3], sep ='')

ce qui donne "abc".

Mais bien sûr, cela ne fonctionne que si je connais la longueur de sdata à l'avance.

581voto

Matt Turner Points 906

Essayez d'utiliser un argument de collapse vide dans la fonction paste :

paste(sdata, collapse = '')

Merci à http://twitter.com/onelinetips/status/7491806343

12 votes

Juste une note que si sdata peut contenir des chaînes de caractères soit toutes de la même longueur soit de longueurs variables alors paste(sdata, sep = '', collapse = '') devrait être utilisé pour éviter des résultats inattendus.

50voto

Ken Williams Points 4686

La réponse de Matt est définitivement la bonne réponse. Cependant, voici une solution alternative à des fins de soulagement comique :

do.call(paste, c(as.list(sdata), sep = ""))

7 votes

Vous auriez vraiment pu inclure une déclaration apply() là-dedans. Si vous le faites, je vous mettrai un vote en haut ;)

0 votes

Ce serait en fait la solution la plus élégante si le paramètre collapse n'existait pas. donc pas beaucoup de soulagement comique si vous avez récemment dû faire quelque chose de très similaire :)

14voto

bartektartanus Points 2472

Vous pouvez utiliser la fonction stri_paste avec le paramètre collapse du package stringi de cette manière :

stri_paste(letters, collapse='')
## [1] "abcdefghijklmnopqrstuvwxyz" 

Et quelques benchmarks :

require(microbenchmark)
test <- stri_rand_lipsum(100)
microbenchmark(stri_paste(test, collapse=''), paste(test,collapse=''), do.call(paste, c(as.list(test), sep="")))
Unit: microseconds
                                      expr     min       lq     mean   median       uq     max neval
           stri_paste(test, collapse = "") 137.477 139.6040 155.8157 148.5810 163.5375 226.171   100
                paste(test, collapse = "") 404.139 406.4100 446.0270 432.3250 442.9825 723.793   100
do.call(paste, c(as.list(test), sep = "")) 216.937 226.0265 251.6779 237.3945 264.8935 405.989   100

8voto

LMc Points 725

La bibliothèque stringr a quelques moyens rapides pour accomplir ceci.

str_flatten

Par défaut, elle va fusionner votre vecteur de caractères sans espaces, mais possède également l'argument collapse :

str_flatten(sdata)
[1] "abc"

Elle a également un argument optionnel last à utiliser à la place du dernier séparateur.

str_c

Similaire à paste avec un argument collapse que vous devez spécifier pour accomplir ceci :

str_c(sdata, collapse = "")
[1] "abc"

str_flatten_comma

Nouveau depuis la version stringr 1.5.0 si vous voulez un séparateur virgule. Ici l'argument last reconnaît la virgule d'Oxford :

str_flatten_comma(sdata)
[1] "a, b, c"

str_flatten_comma(sdata[1:2], last = " and ")
[1] "a and b"

base::paste0

Même s'il n'y a pas d'avantage évident ici par rapport à paste, vous pourriez utiliser paste0(sdata, collapse = "") en base R.


Mettre à jour le benchmark pour un vecteur de chaînes beaucoup plus long a donné les résultats suivants sur ma machine :

set.seed(4)
x <- sample(letters, 1E6, replace = T)
microbenchmark(stri_paste(x, collapse=''), 
               paste(x,collapse=''), 
               do.call(paste, c(as.list(x), sep="")),
               stringr::str_flatten(x),
               stringr::str_c(x, collapse = ""),
               paste0(x, collapse = ""))

Unit: milliseconds
                                    expr      min        lq       mean     median        uq       max neval cld
            stri_paste(x, collapse = "")  21.1788  21.80040   23.45225   22.78430   24.4271   39.1305   100 a  
                 paste(x, collapse = "") 110.7734 114.36595  126.43277  119.02755  136.5902  187.4112   100  b 
 do.call(paste, c(as.list(x), sep = "")) 538.8329 981.80345 1090.51738 1096.33470 1213.8848 1457.5622   100   c
                 stringr::str_flatten(x)  20.6276  21.60610   23.36241   22.73915   24.2210   42.3481   100 a  
        stringr::str_c(x, collapse = "")  20.9274  21.74285   23.75466   22.73950   24.3254   36.6114   100 a  
                paste0(x, collapse = "") 110.0614 112.81175  124.15555  116.96610  130.6330  168.7199   100  b 

Aussi dans l'esprit de la réponse de Ken Williams :

Reduce(paste0, sdata)
[1] "abc"

6voto

Patrick Points 11

Pour sdata :

gsub(", ", "", toString(sdata))

Pour un vecteur d'entiers :

gsub(", ", "", toString(c(1:10)))

7 votes

C'est une réponse dangereuse -- s'il y a des séquences de virgule-espace dans les éléments du vecteur, cette réponse les supprimera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X