Concatenarea unui vector de șiruri de caractere/caractere (Programare, R, String, R Faq)

Nick a intrebat.

Dacă am un vector de tip caracter, cum pot concatena valorile în șir de caractere? Iată cum aș face acest lucru cu paste():

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

producând "abc".

Dar, bineînțeles, acest lucru funcționează numai dacă știu lungimea lui sdata din timp.

7 răspunsuri
Matt Turner

Încercați să utilizați un câmp gol collapse în cadrul funcției de lipire:

paste(sdata, collapse = '')

Vă mulțumim pentru http://twitter.com/onelinetips/status/7491806343

Comentarii

  • Rețineți că dacă sdata poate conține fie șiruri de caractere care au toate aceeași lungime, fie lungimi variabile, atunci paste(sdata, sep = '', collapse = '') pentru a evita rezultate neașteptate. –  > Por zelanix.
Ken Williams

Răspunsul lui Matt este cu siguranță răspunsul corect. Cu toate acestea, iată o soluție alternativă în scop comic:

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

Comentarii

  • chiar ai fi putut lucra o instrucțiune apply() acolo. Dacă o faci, te voi vota 😉 –  > Por JD Long.
  • aceasta ar fi, de fapt, cea mai elegantă soluție dacă collapse parametrul nu exista. deci nu prea multă ușurare comică dacă recent a trebuit să faci ceva foarte asemănător 🙂 –  > Por oaie zburătoare.
bartektartanus

Puteți folosi stri_paste funcția cu collapse parametrul din stringi astfel:

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

Și câteva repere:

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

Comentarii

  • Nu am mai efectuat niciodată benchmark-uri în R. E plăcut să înveți ceva nou. –  > Por Torrien.
Patrick

Pentru sdata:

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

Pentru un vector de numere întregi:

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

Comentarii

  • Acesta este un răspuns periculos — dacă există secvențe de spații cu virgulă în elementele vectorului, acest răspuns le va elimina. –  > Por C8H10N4O2.
C8H10N4O2

Răspunsul lui Matt Turner este cu siguranță răspunsul corect. Cu toate acestea, în spiritul răspunsului lui Ken Williams, ați putea, de asemenea, să faceți:

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

fan

Iată o mică funcție utilitară care reduce o listă de valori cu sau fără nume la un singur șir de caractere pentru a facilita imprimarea. De asemenea, va imprima linia de cod în sine. Este din aplicația mea exemple de liste în R pagina.

Generați câteva liste numite sau nenumite:

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

Iată o funcție care va converti listele numite sau nenumite în șiruri de caractere:

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

Testați funcția cu listele create anterior:

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

Testarea funcției cu un subset de elemente ale listei:

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

AlexB

O altă modalitate ar fi să se utilizeze glue pachet:

glue_collapse(glue("{sdata}"))
paste(glue("{sdata}"), collapse = '')

Tags:, ,