Concaténer un vecteur de chaînes / caractère

273

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

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

céder "abc".

Mais bien sûr, cela ne fonctionne que si je connais la longueur des données à l' avance.

pseudo
la source

Réponses:

480

Essayez d'utiliser un argument d' effondrement vide dans la fonction coller:

paste(sdata, collapse = '')

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

Matt Turner
la source
7
Juste une note que si sdatapeut contenir des chaînes qui sont toutes de la même longueur ou de longueurs variables, alors paste(sdata, sep = '', collapse = '')il faut l'utiliser pour éviter des résultats inattendus.
zelanix
42

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

do.call(paste, c(as.list(sdata), sep = ""))
Ken Williams
la source
6
vous auriez vraiment pu y travailler une instruction apply (). Si vous le faites, je vous voterai;)
JD Long
ce serait en fait la solution la plus élégante si le collapseparamètre n'existait pas. donc pas beaucoup de soulagement comique si vous avez récemment dû faire quelque chose de très similaire :)
voler des moutons
9

Vous pouvez utiliser la stri_pastefonction avec le collapseparamètre du stringipackage comme ceci:

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

Et quelques repères:

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
bartektartanus
la source
2
Je n'avais jamais effectué de benchmarks sur R. Nice pour apprendre quelque chose de nouveau.
Torrien
6

Pour sdata:

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

Pour un vecteur d'entiers:

gsub(", ","",toString(c(1:10)))
Patrick
la source
6
C'est une réponse dangereuse - s'il y a des séquences d'espace virgule dans les éléments du vecteur, cette réponse les supprimera.
C8H10N4O2
5

La réponse de Matt Turner est certainement la bonne réponse. Cependant, dans l'esprit de la réponse de Ken Williams, vous pourriez également faire:

capture.output(cat(sdata, sep="")) 
C8H10N4O2
la source
1

Voici une petite fonction utilitaire qui réduit une liste de valeurs nommée ou non en une seule chaîne pour une impression plus facile. Il imprimera également la ligne de code elle-même. C'est de ma liste d'exemples dans la page R.

Générez des listes nommées ou non:

# Define Lists
ls_num <- list(1,2,3)
ls_str <- list('1','2','3')
ls_num_str <- list(1,2,'3')

# Named Lists
ar_st_names <- c('e1','e2','e3')
ls_num_str_named <- ls_num_str
names(ls_num_str_named) <- ar_st_names

# Add Element to Named List
ls_num_str_named$e4 <- 'this is added'

Voici une fonction qui convertira la liste nommée ou non en chaîne:

ffi_lst2str <- function(ls_list, st_desc, bl_print=TRUE) {

  # string desc
  if(missing(st_desc)){
    st_desc <- deparse(substitute(ls_list))
  }

  # create string
  st_string_from_list = paste0(paste0(st_desc, ':'), 
                               paste(names(ls_list), ls_list, sep="=", collapse=";" ))

  if (bl_print){
    print(st_string_from_list)
  }
}

Test de la fonction avec les listes créées préalablement:

> ffi_lst2str(ls_num)
[1] "ls_num:=1;=2;=3"
> ffi_lst2str(ls_str)
[1] "ls_str:=1;=2;=3"
> ffi_lst2str(ls_num_str)
[1] "ls_num_str:=1;=2;=3"
> ffi_lst2str(ls_num_str_named)
[1] "ls_num_str_named:e1=1;e2=2;e3=3;e4=this is added"

Test de la fonction avec un sous-ensemble d'éléments de liste:

> ffi_lst2str(ls_num_str_named[c('e2','e3','e4')])
[1] "ls_num_str_named[c(\"e2\", \"e3\", \"e4\")]:e2=2;e3=3;e4=this is added"
> ffi_lst2str(ls_num[2:3])
[1] "ls_num[2:3]:=2;=3"
> ffi_lst2str(ls_str[2:3])
[1] "ls_str[2:3]:=2;=3"
> ffi_lst2str(ls_num_str[2:4])
[1] "ls_num_str[2:4]:=2;=3;=NULL"
> ffi_lst2str(ls_num_str_named[c('e2','e3','e4')])
[1] "ls_num_str_named[c(\"e2\", \"e3\", \"e4\")]:e2=2;e3=3;e4=this is added"
ventilateur
la source