文字列を繰り返し複製する時には、str_dup()
と strrep()
などを使う。
str_dup()
:stringr
パッケージの関数で、ベクトル化が簡単、使い方が直感的。strrep()
:base R (標準関数)の関数で、追加パッケージのインストールは不要。
類似の関数にrep()
があるけど、これは、ベクトル全体を繰り返すのに使う。str_dup()
とstrrep()
は文字列の繰り返しに特化しているので、使い方がちょっと異なる。
str_dup()
str_dup(string, times)
は、stringr
パッケージの関数で、指定した回数だけ文字列を繰り返すために使う。
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 の関数で、指定した回数だけ文字列を繰り返すために使う。
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() ではベクトルをコピー |