wake-up-neo.net

Wie können zwei Zeichenfolgen verkettet werden?

Wie kann ich zwei Werte verketten (zusammenführen, kombinieren)? Zum Beispiel habe ich:

tmp = cbind("GAD", "AB")
tmp
#      [,1]  [,2]
# [1,] "GAD" "AB"

Mein Ziel ist es, die beiden Werte in "tmp" zu einer Zeichenfolge zu verketten:

tmp_new = "GAD,AB"

Welche Funktion kann das für mich tun?

350
Hans
paste()

ist der Weg zu gehen. Wie in den vorherigen Postern bereits erwähnt, kann Paste zwei Dinge bewirken:

verketten von Werten zu einer "Zeichenkette", z.

> paste("Hello", "world", sep=" ")
[1] "Hello world"

dabei gibt das Argument sep die Zeichen an, die zwischen den Argumenten zum Verketten oder Reduzieren von Zeichenvektoren verwendet werden sollen

> x <- c("Hello", "World")
> x
[1] "Hello" "World"
> paste(x, collapse="--")
[1] "Hello--World"

dabei gibt das Argument collapse die Zeichen an, die zwischen den Elementen des zu reduzierenden Vektors verwendet werden sollen.

Sie können sogar beides kombinieren:

> paste(x, "and some more", sep="|-|", collapse="--")
[1] "Hello|-|and some more--World|-|and some more"

Hoffe das hilft.

466
Rainer

help.search() ist eine praktische Funktion, z.

> help.search("concatenate")

führt Sie zu paste().

81
rtelmore

Für die erste nicht paste() Antwort können wir uns stringr::str_c() (und dann toString() unten) ansehen. Seit dieser Frage gibt es nichts mehr. Ich denke, es ist nützlich zu erwähnen, dass es sie auch gibt.

Sehr einfach zu bedienen, wie Sie sehen können.

tmp <- cbind("GAD", "AB")
library(stringr)
str_c(tmp, collapse = ",")
# [1] "GAD,AB"

Aus der Beschreibung der Dokumentationsdatei geht hervor, dass es gut zu diesem Problem passt.

Um zu verstehen, wie str_c funktioniert, müssen Sie sich vorstellen, dass Sie eine Matrix aus Zeichenfolgen aufbauen. Jedes Eingabeargument bildet eine Spalte und wird unter Verwendung der üblichen Umformungsregeln auf die Länge des längsten Arguments erweitert. Die Sep-Zeichenfolge wird zwischen jede Spalte eingefügt. Wenn collapse NULL ist, wird jede Zeile zu einer einzigen Zeichenfolge zusammengefasst. Wenn diese Zeichenfolge nicht NULL ist, wird sie am Ende jeder Zeile eingefügt und die gesamte Matrix zu einer einzelnen Zeichenfolge zusammengefasst.

Hinzugefügt am 13.04.2016: Es ist nicht genau das Gleiche wie die gewünschte Ausgabe (zusätzlicher Speicherplatz), aber es wurde auch nicht erwähnt. toString() ist im Grunde eine Version von paste() mit collapse = ", " fest programmiert

toString(tmp)
# [1] "GAD, AB"
41
Rich Scriven

Wie bereits erwähnt, ist paste() der richtige Weg. Es kann jedoch ärgerlich sein, jedes Mal paste(str1, str2, str3, sep='') eingeben zu müssen, wenn das nicht standardmäßige Trennzeichen verwendet werden soll.

Sie können sehr einfach Wrapper-Funktionen erstellen, die das Leben viel einfacher machen. Wenn Sie beispielsweise feststellen, dass Sie häufig Zeichenfolgen ohne Trennzeichen verketten, können Sie Folgendes tun:

p <- function(..., sep='') {
    paste(..., sep=sep, collapse=sep)
}

oder wenn Sie häufig Zeichenfolgen aus einem Vektor verbinden möchten (wie implode() aus PHP):

implode <- function(..., sep='') {
     paste(..., collapse=sep)
}

Ermöglicht Folgendes:

p('a', 'b', 'c')
#[1] "abc"
vec <- c('a', 'b', 'c')
implode(vec)
#[1] "abc"
implode(vec, sep=', ')
#[1] "a, b, c"

Es gibt auch den eingebauten paste0, der das Gleiche wie mein implode macht, jedoch keine benutzerdefinierten Trennzeichen zulässt. Es ist etwas effizienter als paste().

33
naught101
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"

Ich habe dies bei Google gefunden, indem ich nach R verketteten Zeichenfolgen gesucht habe : http://stat.ethz.ch/R-manual/R- gepatcht/library/base/html/paste.html

30
Ville Salonen

Alternativ können Sie cat verwenden, wenn Sie die Ausgabe direkt in eine Datei oder stdout wünschen:

cat(s1, s2, sep=", ")
28
Megatron

Ein anderer Weg:

sprintf("%s you can add other static strings here %s",string1,string2)

Es ist manchmal nützlich als die Funktion paste(). %s bezeichnet den Ort, an dem die subjektiven Zeichenfolgen eingefügt werden.

Beachten Sie, dass dies nützlich sein wird, wenn Sie versuchen, einen Pfad zu erstellen:

sprintf("/%s", paste("this", "is", "a", "path", sep="/"))

ausgabe

/this/is/a/path
18
Suat Atan PhD

Sie können einen eigenen Operator erstellen:

'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`

Sie können auch den Operator 'und' (&) neu definieren:

'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"

das Durcheinander mit der Basissyntax ist hässlich, aber mit paste()/paste0() können Sie (fast immer) den logischen Operator & and durch * ersetzen und die logischen Werte multiplizieren, wenn Sie nur mit Ihrem eigenen Code arbeiten anstelle von logischem 'und &'

18
Qbik

In Anbetracht der Matrix tmp, die Sie erstellt haben:

paste(tmp[1,], collapse = ",")

Ich nehme an, es gibt einen Grund, warum Sie eine Matrix mit cbind erstellen, anstatt einfach:

tmp <- "GAD,AB"
14
neilfws

Betrachten Sie den Fall, in dem die Zeichenfolgen Spalten sind und das Ergebnis eine neue Spalte sein sollte:

df <- data.frame(a = letters[1:5], b = LETTERS[1:5], c = 1:5)

df$new_col <- do.call(paste, c(df[c("a", "b")], sep = ", ")) 
df
#  a b c new_col
#1 a A 1    a, A
#2 b B 2    b, B
#3 c C 3    c, C
#4 d D 4    d, D
#5 e E 5    e, E

Überspringen Sie optional die Untergruppe [c("a", "b")], wenn alle Spalten eingefügt werden müssen.

# you can also try str_c from stringr package as mentioned by other users too!
do.call(str_c, c(df[c("a", "b")], sep = ", ")) 
2
joel.wilson

Eine weitere Antwort ohne Einfügen:

x <- capture.output(cat(data, sep = ","))
x
[1] "GAD,AB"

Wo

 data <- c("GAD", "AB")
1
sindri_baldur

glue ist eine neue Funktion, Datenklasse und ein Paket, die als Teil von tidyverse mit vielen erweiterten Funktionen entwickelt wurden. Es kombiniert Funktionen aus Paste, Sprintf und den vorherigen anderen Antworten.

tmp <- tibble::tibble(firststring = "GAD", secondstring = "AB")
(tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}"))
#> GAD,AB

Erstellt am 06.03.2019 von reprex package (v0.2.1)

Ja, es ist übertrieben für das einfache Beispiel in dieser Frage, aber mächtig für viele Situationen. (siehe https://glue.tidyverse.org/ )

Schnelles Beispiel im Vergleich zu paste mit with unten. Der glue Code war ein bisschen einfacher zu tippen und sieht ein bisschen einfacher zu lesen aus.

tmp <- tibble::tibble(firststring = c("GAD", "GAD2", "GAD3"), secondstring = c("AB1", "AB2", "AB3"))
(tmp_new <- glue::glue_data(tmp, "{firststring} and {secondstring} went to the park for a walk. {firststring} forgot his keys."))
#> GAD and AB1 went to the park for a walk. GAD forgot his keys.
#> GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys.
#> GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys.
(with(tmp, paste(firststring, "and", secondstring, "went to the park for a walk.", firststring, "forgot his keys.")))
#> [1] "GAD and AB1 went to the park for a walk. GAD forgot his keys."  
#> [2] "GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys."
#> [3] "GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys."

Erstellt am 06.03.2019 von reprex package (v0.2.1)

1
Arthur Yip