R logo

文字列を繰り返し複製する時には、str_dup()strrep()などを使う。

  • str_dup()stringrパッケージの関数で、ベクトル化が簡単、使い方が直感的。
  • strrep():base R (標準関数)の関数で、追加パッケージのインストールは不要。

 

類似の関数にrep()があるけど、これは、ベクトル全体を繰り返すのに使う。str_dup()strrep()は文字列の繰り返しに特化しているので、使い方がちょっと異なる。

str_dup()

str_dup(string, times)
は、stringrパッケージの関数で、指定した回数だけ文字列を繰り返すために使う。

str_dup() の基本構文
str_dup(string, times)
  • string: 繰り返す文字列(文字列ベクトルも可能)
  • times: 繰り返す回数(ベクトル化可能:要素ごとに異なる繰り返し回数が指定できる)

使い方の例

文字列を繰り返す

# 文字列を3回繰り返す
result <- str_dup("Hello", 3)
print(result)
output
[1] "HelloHelloHello"
  • 文字列 "Hello" を3回繰り返し、1つの文字列になった。

ベクトル内の文字列をそれぞれ繰り返す

result <- str_dup(c("A", "B", "C"), c(1, 2, 3))
print(result)
output
[1] "A"   "BB"  "CCC"
  • 各要素に対して、個別の繰り返し回数が適用される。
    • "A" は 1回
    • "B" は 2回
    • "C" は 3回

    単一の繰り返し回数を指定(ベクトル全体に適用)

result <- str_dup(c("A", "B", "C"), 3)
print(result)
output
[1] "AAA" "BBB" "CCC"
  • すべての要素に対して3回繰り返しが行われる。

NAの扱い

result <- str_dup(c("A", NA, "C"), 3)
print(result)
output
[1] "AAA" NA    "CCC"
  • NAはそのままNAとして返される。

数値を文字列として繰り返す

result <- str_dup(as.character(123), 3)
print(result)
output
[1] "123123123"
  • 数値を文字列に変換して繰り返すことが可能。

str_dup() のまとめ

操作内容 コード例 結果
文字列の繰り返し str_dup("Hello", 3) "HelloHelloHello"
複数の要素を繰り返し str_dup(c("A", "B"), c(2, 3)) "AA", "BBB"
NAの扱い str_dup(c("A", NA, "B"), 3) "AAA", NA, "BBB"
数値の扱い str_dup(as.character(123), 3) "123123123"

strrep()

strrep(x, times)は、base R の関数で、指定した回数だけ文字列を繰り返すために使う。

strrep() の基本構文
streep(x, times)
  • x: 繰り返す文字列(文字列ベクトルも可能)
  • times: 繰り返す回数(ベクトル化可能)

使い方の例

文字列を繰り返す

# 文字列を3回繰り返す
result <- strrep("Hello", 3)
print(result)
output
[1] "HelloHelloHello"
  • 文字列 "Hello" を3回繰り返し、1つの文字列になった。

ベクトル内の文字列をそれぞれ繰り返す

result <- strrep(c("A", "B", "C"), c(1, 2, 3))
print(result)
output
[1] "A"   "BB"  "CCC"
  • それぞれの要素に対して個別の繰り返し回数が適用される。

単一の回数を指定(ベクトル全体に適用)

result <- strrep(c("A", "B", "C"), 3)
print(result)
output
[1] "AAA" "BBB" "CCC"
  • すべての要素に対して3回繰り返しが行われる。

NAの扱い

result <- strrep(c("A", NA, "B"), 3)
print(result)
output
[1] "AAA" NA    "BBB"
  • NAはそのままNAとして返される。

strrep() のまとめ

操作内容 コード例 結果
文字列の繰り返し strrep("Hello", 3) "HelloHelloHello"
複数の要素を繰り返し strrep(c("A", "B"), c(2, 3)) "AA", "BBB"
NAの扱い strrep(c("A", NA, "B"), 3) "AAA", NA, "BBB"
数値の扱い strrep(as.character(123), 3) "123123123"

str_dup() と strrep() の違い

機能 str_dup() strrep()
パッケージ stringr base R
ベクトル対応 ✅ 完全対応 ✅ 完全対応
NAの扱い NAをそのまま返す NAをそのまま返す
可読性 ✅ わかりやすい ⚠️ ややわかりにくい
パッケージ要件 ✅ stringrが必要 ❌ 不要 (base RのみでOK)

どっちを使うべき?

どちらも基本的な機能は同じだけれど、code class="code-small">str_dup()はtidyverseの流れに沿っているので、str_dup()を使っておいた方が良い、と思う。

やりたい操作 おすすめの関数
Rの標準関数を使いたい strrep()
tidyverseの流れに沿いたい str_dup()
NAの処理を考慮する どちらでもOK

rep()との違い

「繰り返し」と言ったらrep()が思い浮かぶかもしれないけど、rep()はベクトル全体を繰り返すのに使う関数で、文字列の繰り返しには向いていない。

試しに、上記と同じ例をrep()で実行してみる。

rep()を使った場合

文字列の要素をベクトルとして繰り返す場合

# 文字列を3回繰り返す
result <- rep("Hello", 3)
print(result)
output
[1] "Hello" "Hello" "Hello"
  • Helloが3回繰り返されてベクトルが作成される。
  • rep()は要素のコピーを作成するだけで、文字の繰り返しは行わない。

ベクトルを繰り返す場合

# ベクトルを繰り返す
result <- rep(c("A", "B"), 3)
print(result)
output
[1] "A" "B" "A" "B" "A" "B"
  • ベクトル全体が繰り返されるため、A, B, A, B, A, B となる。

各要素の繰り返しを指定する場合

# 各要素をそれぞれ繰り返す
result <- rep(c("A", "B", "C"), c(1, 2, 3))
print(result)
output
[1] "A"   "B" "B"  "C" "C" "C"
  • Aは1回、Bは2回、Cは3回 繰り返されて、1つのベクトルになる。
  • rep()のtimesはベクトル全体の繰り返しではなく、要素ごとの回数を指定している。

 

まとめると、以下のような感じ。

操作 rep() では可能か? 理由
文字の内容を繰り返す ❌ 不可 rep() はベクトルの要素を繰り返すだけ
文字の中身を繰り返す ✅ 可能 (工夫が必要) 例えば、rep("A", each = 3) では要素が繰り返されるだけ
1つの文字列に繰り返し ❌ 不可 1つの文字列内で繰り返しが必要なら str_dup() / strrep()
ベクトルの操作 ✅ 可能 rep() ではベクトルをコピー