Verketten Sie einen Vektor aus Zeichenfolgen / Zeichen

273

Wie kann ich die Werte zu einer Zeichenfolge verketten, wenn ich einen Vektor vom Typ Zeichen habe? So würde ich es mit paste () machen :

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

Nachgeben "abc".

Aber das funktioniert natürlich nur, wenn ich die Länge der SD-Daten im Voraus kenne .

Nick
quelle

Antworten:

480

Versuchen Sie, ein leeres Verwendung Zusammenbruch Argument innerhalb der Paste - Funktion:

paste(sdata, collapse = '')

Vielen Dank an http://twitter.com/onelinetips/status/7491806343

Matt Turner
quelle
7
Nur ein Hinweis, dass wenn unerwartete sdataZeichenfolgen mit gleicher Länge oder variabler Länge enthalten paste(sdata, sep = '', collapse = '')können, unerwartete Ergebnisse vermieden werden sollten.
Zelanix
42

Matts Antwort ist definitiv die richtige Antwort. Hier ist jedoch eine alternative Lösung für Comic-Hilfszwecke:

do.call(paste, c(as.list(sdata), sep = ""))
Ken Williams
quelle
6
Sie hätten dort wirklich eine apply () - Anweisung einarbeiten können. Wenn du das tust, werde ich dich abstimmen;)
JD Long
Dies wäre tatsächlich die eleganteste Lösung, wenn der collapseParameter nicht vorhanden wäre. Also nicht viel komödiantische Erleichterung, wenn Sie kürzlich tatsächlich etwas sehr Ähnliches tun mussten :)
fliegende Schafe
9

Sie können die stri_pasteFunktion mit collapseParametern aus dem stringiPaket wie folgt verwenden:

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

Und einige 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
Bartektartanus
quelle
2
Ich hatte noch nie Benchmarks an R. Nice durchgeführt, um etwas Neues zu lernen.
Torrien
6

Für sdata:

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

Für einen Vektor von ganzen Zahlen:

gsub(", ","",toString(c(1:10)))
Patrick
quelle
6
Dies ist eine gefährliche Antwort. Wenn die Elemente des Vektors Komma-Raum-Sequenzen enthalten, werden diese durch diese Antwort entfernt.
C8H10N4O2
5

Matt Turners Antwort ist definitiv die richtige Antwort. Im Geiste der Antwort von Ken Williams könnten Sie jedoch auch Folgendes tun:

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

Hier ist eine kleine Dienstprogrammfunktion, die eine benannte oder unbenannte Werteliste zum einfacheren Drucken zu einer einzigen Zeichenfolge zusammenfasst. Es wird auch die Codezeile selbst gedruckt. Es ist aus meiner Liste Beispiele in R- Seite.

Generieren Sie einige Listen mit oder ohne Namen:

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

Hier ist eine Funktion, die benannte oder unbenannte Listen in Zeichenfolgen konvertiert:

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

Testen der Funktion mit den zuvor erstellten Listen:

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

Testen der Funktion mit einer Teilmenge von Listenelementen:

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