Concatenar un vector de cadenas / caracteres


273

Si tengo un vector de caracteres tipo, ¿cómo puedo concatenar los valores en una cadena? Así es como lo haría con paste () :

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

cediendo "abc".

Pero, por supuesto, eso solo funciona si conozco la longitud de los datos por adelantado.

Respuestas:


480

Intente usar un argumento de contracción vacío dentro de la función pegar:

paste(sdata, collapse = '')

Gracias a http://twitter.com/onelinetips/status/7491806343


77
Solo una nota de que si sdatapuede contener cadenas que son todas de la misma longitud o de longitudes variables, paste(sdata, sep = '', collapse = '')debe usarse para evitar resultados inesperados.
zelanix

42

La respuesta de Matt es definitivamente la respuesta correcta. Sin embargo, aquí hay una solución alternativa para fines de alivio cómico:

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

66
Realmente podría haber trabajado una declaración apply () allí. Si lo haces, te votaré;)
JD Long

esta sería realmente la solución más elegante si el collapseparámetro no existiera. así que no hay mucho alivio cómico si recientemente tuviste que hacer algo muy similar :)
ovejas voladoras

9

Puede usar la stri_pastefunción con el collapseparámetro del stringipaquete de esta manera:

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

Y algunos puntos de referencia:

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

2
Nunca había realizado puntos de referencia en R. Nice para aprender algo nuevo.
Torrien

6

Para sdata:

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

Para un vector de enteros:

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

66
Esta es una respuesta peligrosa: si hay secuencias de espacio de coma en los elementos del vector, esta respuesta las eliminará.
C8H10N4O2

5

La respuesta de Matt Turner es definitivamente la respuesta correcta. Sin embargo, en el espíritu de la respuesta de Ken Williams, también podría hacer:

capture.output(cat(sdata, sep="")) 

1

Aquí hay una pequeña función de utilidad que contrae una lista de valores con nombre o sin nombre en una sola cadena para facilitar la impresión. También imprimirá la línea de código en sí. Es de mi lista de ejemplos en la página R.

Genere algunas listas con o sin nombre:

# 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'

Aquí está la función que convertirá la lista con nombre o sin nombre en cadena:

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)
  }
}

Probar la función con las listas creadas anteriormente:

> 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"

Probar la función con un subconjunto de elementos de la lista:

> 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"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.