R logo

文字列を繋げるときには、paste(), paste0(), str_c()などを使う。

paste()paste0()は、Rの標準パッケージ(base)。

str_c()は、stringrパッケージの関数。

str_cの方が使いやすいけど、小規模のプロジェクトではbaseのpasteで十分。

baseとstringrの違いの詳細は、下記参照。

以下、それぞれの使い方と、使用例、ポイントの比較等のまとめ。

paste()

paste()は、文字列を結合する最も基本的な関数。スペース(" ")がデフォルトの区切り文字として使われる。

paste()の基本構文

paste(文字列1, 文字列2, ..., sep = "区切り文字")

使い方色々

  • 区切り文字を指定する
  • 区切り文字なしで結合する
  • ベクトルとの結合

etc...

基本的な使い方

v <- paste("A", "B", 1)
print(v)
output
result: "A B 1"

区切り文字を指定する

v <- paste("A", "B", 1, sep = "-")
print(v)
output
result: "A-B-1"

例3:区切り文字なしで結合する

v <- paste("A", "B", 1, sep = "")
print(v)
output
result: "AB1"

例4:ベクトルとの結合

v <- paste("A", "B", 1:3, sep = "_")
print(v)
output
result: "A_B_1" "A_B_2" "A_B_3"

paste0()

paste0()は、paste()の省略形。区切り文字を指定せず、すべてを隙間なく結合する。

つまり、paste(sep = "")と同じ動作をするイメージ。

paste0()の基本構文

paste0(文字列1, 文字列2, ...)

使い方色々

  • 基本的な使い方
  • ベクトルとの結合

基本的な使い方

v <- paste0("A", "B", 1)
print(v)
output
result: "AB1"

ベクトルとの結合

v <- paste0("A", "B", 1:3)
print(v)
output
result: "AB1" "AB2" "AB3"

 

paste0()paste(sep = "")と同じ機能を持つため、余分な記述が不要。

なので、区切り文字が不要な場合はpaste0()を使うと簡単に記述できる。

str_c()(stringr::str_c)

str_c()は、stringrパッケージの関数なので、最初にstringrパッケージを読み込む必要がある。

library("stringr")

機能はpaste0()と似ている……けれども、NAの扱い方が異なる。

NAを無視して結合したい場合には、str_c()が便利。

str_c()の基本構文

str_c(文字列1, 文字列2, ..., sep = "区切り文字", na.rm = TRUE)

使い方色々

  • 基本的な使い方
  • NAを含むデータの結合
  • NAを無視した結合

基本的な使い方

v <- str_c("A", "B", 1)    # sepはデフォルトで区切りなし
print(v)
output
result: "AB1"

NAを含むデータの結合

v <- str_c("A", NA, "B", sep = "-")
print(v)
output
result: "A-NA-B"

NAを無視した結合

v <- str_c("A", NA, "B", sep = "-", na.rm = TRUE)
print(v)
output
result: "A-B"

それぞれの関数の比較

それぞれの関数を比較すると、以下のような感じ。

関数 デフォルト区切り NAの処理 ベクトルの動作 便利な機能
paste() スペース NAは結果全体をNAに すべての要素がベクトル化 sepで区切り指定可能
paste0() 区切りなし NAは結果全体をNAに すべての要素がベクトル化 簡潔な書き方
str_c() 区切りなし NAを無視できる すべての要素がベクトル化 NA無視 (na.rm = TRUE)

それぞれの関数の使い所は、以下のようなイメージ。

  • paste() → スペースまたは指定した文字でつなげたいとき。
  • paste0() → 区切りなしで結合したいとき。
  • str_c() → NAが含まれる文字列の結合や、NAの無視を行いたいとき。

 

……普段使いには str_c()が便利だと思う。