Concatena un vettore di stringhe / carattere


273

Se ho un vettore di tipo carattere, come posso concatenare i valori in stringa? Ecco come lo farei con paste () :

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

cedendo "abc".

Ma, naturalmente, funziona solo se conosco in anticipo la lunghezza degli sdata .

Risposte:


480

Prova a utilizzare un argomento di compressione vuoto all'interno della funzione incolla:

paste(sdata, collapse = '')

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


7
Solo una nota che se sdatapuò contenere stringhe che sono tutte della stessa lunghezza o di lunghezze variabili, allora paste(sdata, sep = '', collapse = '')dovrebbe essere usato per evitare risultati imprevisti.
zelanix,

42

La risposta di Matt è sicuramente la risposta giusta. Tuttavia, ecco una soluzione alternativa per scopi di rilievo comico:

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

6
avresti davvero potuto usare un'istruzione apply () lì dentro. Se lo farai, ti voterò;)
JD Long

questa sarebbe effettivamente la soluzione più elegante se il collapseparametro non esistesse. quindi non molto sollievo comico se di recente hai dovuto fare qualcosa di molto simile :)
volare pecore il

9

È possibile utilizzare la stri_pastefunzione con il collapseparametro dal stringipacchetto in questo modo:

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

E alcuni benchmark:

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
Non avevo mai eseguito benchmark su R. Nice per imparare qualcosa di nuovo.
Torrien,

6

Per sdata:

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

Per un vettore di numeri interi:

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

6
Questa è una risposta pericolosa: se ci sono sequenze di spazi tra virgole negli elementi del vettore, questa risposta li rimuoverà.
C8H10N4O2,

5

La risposta di Matt Turner è sicuramente la risposta giusta. Tuttavia, nello spirito della risposta di Ken Williams, potresti anche fare:

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

1

Ecco una piccola funzione di utilità che comprime un elenco di valori con o senza nome in una singola stringa per una stampa più semplice. Stampa anche la riga di codice stessa. Viene dal mio elenco di esempi nella pagina R.

Genera alcuni elenchi denominati o senza nome:

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

Ecco la funzione che converte l'elenco con nome o senza nome in stringa:

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 della funzione con gli elenchi creati in precedenza:

> 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 della funzione con un sottoinsieme di elementi dell'elenco:

> 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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.