2つの文字列を連結するにはどうすればよいですか?


375

2つの値を連結(マージ、結合)するにはどうすればよいですか?たとえば、私は持っています:

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

私の目標は、「tmp」の2つの値を1つの文字列に連結することです。

tmp_new = "GAD,AB"

これを行うことができる関数はどれですか?


@RichardScrivenの回答ノートのように、文字列がベクトルの場合、ここでのほとんどの回答は壊れます。
smci 2016年

@smci私が投稿した小さな答えはどうですか?それを改善するための提案はありますか?
joel.wilson 2017年

回答:


505
paste()

行く方法です。以前のポスターが指摘したように、貼り付けは2つのことを行うことができます。

値を1つの「文字列」に連結します。例:

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

ここで、引数sepは、文字ベクトルを連結または折りたたむために引数間で使用される文字を指定します

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

ここで、引数collapseは、折りたたまれるベクトルの要素間で使用される文字を指定します。

両方を組み合わせることもできます。

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

お役に立てれば。


9
文字列とベクトル、または長さの異なるベクトルを混在させることはpaste()、好みに合わせて少し柔軟すぎます。たとえば、paste(c('a','b'),'blah', c(1,2,3))結果はになり"a blah 1" "b blah 2" "a blah 3"ます。基本的には、渡された最長のベクトルと同じ長さの文字列のベクトルを作成し、他の長さのベクトル/文字列を同じ長さにループします。そこには偶然の行動のための十分な余地があります。
naught101 14

1
正しい-しかし、あなたはその問題に対処する別のアプローチを提供できますか?
Rainer 14

1
いいえ-あなたの答えは正しいです(同じことを言う他のほとんどの答えもそうです)。ペーストの動作はその柔軟性の点で異常であることを指摘しました。
naught101 14

2
@ naught101私はそれをRの標準では異常だとは思わないでしょう。ベクトルのリサイクルは、R関数の一般的なプロパティです。'何とか'は長さ1のベクトルであることを覚えておいてください。リサイクルの性質によりpaste0("blah", 1:3)、取得するようなことを簡単に実行でき"blah1" "blah2" "blah3"ます。
Dason、2014

5
はい、貼り付けるだけではなく、Rについて不満を言う必要があります:P。それは実際にdata.frame()はR全体で一貫性がありません- ベクトルがお互いの倍数でない場合、あなたにそれをさせません。matrix()警告を吐き出しますが、吐き出しarray()ません。ちょっと迷惑です。本当に、いくつかのオプションが設定されていない限り、それらはすべて警告を吐き出すべきです...
naught101

85

help.search() 便利な機能です。

> help.search("concatenate")

につながりますpaste()


42

最初の非paste()回答についてはstringr::str_c()toString()以下を参照してください。この質問はまだ出回っていないので、存在していることを述べておくことは有益だと思います。

ご覧のとおり、使い方は非常に簡単です。

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

ドキュメントファイルの説明から、この問題にうまく適合しています。

str_cのしくみを理解するには、文字列の行列を作成していることを想像する必要があります。各入力引数は列を形成し、通常の再利用規則を使用して、最も長い引数の長さに拡張されます。各列の間にsep文字列が挿入されます。collapseがNULLの場合、各行は単一の文字列に縮小されます。NULLでない場合、その文字列は各行の最後に挿入され、マトリックス全体が単一の文字列に縮小されます。

追加4/13/2016:希望の出力(余分なスペース)と完全に同じではありませんが、誰も言及していません。 toString()基本的にpaste()collapse = ", "ハードコードされたバージョンなので、

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

3
えっと、これはtmpがベクトルであり、単なる値の束ではなく、ベクトルを処理しないという事実に対処する唯一の答えですpaste。他のオプションはdo.call(paste, as.list(tmp))です。
naught101

35

他の人が指摘しpaste()たように、行く方法です。ただし、paste(str1, str2, str3, sep='')デフォルト以外のセパレータを使用するたびに入力しなければならないのは面倒です。

人生をずっと単純にするラッパー関数を非常に簡単に作成できます。たとえば、区切り文字のない文字列を頻繁に連結している場合は、次のようにすることができます。

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

または、(implode()PHPのような)ベクトルから文字列を結合したい場合:

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

これを行うことができます:

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

また、paste0myと同じことを行う組み込みのがありますが、implodeカスタムのセパレーターは許可されていません。と比べて少し効率的ですpaste()



28

または、目的がファイルまたはstdoutに直接出力することである場合は、次を使用できますcat

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

4
では、すでにpaste数十のpaste回答がある場合、4年後に回答を投稿する意味は何でしょうか。
デビッドアレンブルク2017年

4
その時、私は自分のために複数の答えをまとめることが役に立ったと思いました。目的は投票を収集することではなく、他の多くの提供されたソリューションをフィルタリングするのを助けることでした。多くの場合、それは私が探しているものです。
メガトロン2017年

22

別の方法:

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

paste()機能よりも便利な場合があります。%s主観的な文字列が含まれる場所を示します。

これは、パスを作成するときに便利です。

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

出力

/this/is/a/path

Rを扱うCプログラマーにとって、sprintfは「2つの文字列を連結する」ためによく知られていて便利です
subsci

はるかに良い私見。paste文字列に何かを追加したい場合、柔軟性は十分ではありません。
displaynameは

20

独自の演算子を作成できます。

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

'and'(&)演算子を再定義することもできます:

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

ベースライン構文をいじるのは醜いpaste()/paste0()ですが、独自のコードだけで作業する場合は、論理& and演算子を置き換え*て、論理 'and&'の代わりに論理演算子を置き換えて論理値の乗算を行うことができます。


@Richard Scriven maybyわかりませんが、簡単なようです。比較してみてください。paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4]))そしてas.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
Qbik

とてもとてもいい!&は多くの言語での連結の標準です。実際には、Rがデフォルトでそれを持っているべきだったと思います。この方法を強くお勧めします
Serhii

14

作成した行列tmpが与えられた場合:

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

単純にではなく、cbindを使用して行列を作成する理由はいくつかあると思います。

tmp <- "GAD,AB"

3

文字列が列であり、結果が新しい列である場合を考えます。

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

[c("a", "b")]すべての列を貼り付ける必要がある場合は、オプションでサブセットをスキップします。

# 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 = ", ")) 

わかりましたが、stringi, stringrライブラリの方が高速です。
smci

2

別の非貼り付けの答え:

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

どこ

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

2

glueは、の一部として開発された新しい関数、データクラス、およびパッケージでありtidyverse、多くの拡張機能を備えています。貼り付け、sprintf、および他の以前の答えの機能を組み合わせています。

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

reprexパッケージ(v0.2.1)によって2019-03-06に作成されました

はい、それはこの質問の簡単な例ではやり過ぎですが、多くの状況では強力です。(https://glue.tidyverse.org/を参照)

クイックの例では、と比較pasteしてwith以下。glueコードが入力する少し簡単だったと読み少し簡単になります。

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

reprexパッケージ(v0.2.1)によって2019-03-06に作成されました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.