文字列の中の文字数をカウントする方法としては、R標準パッケージ(base)に含まれるnchar()
関数や、stringr
パッケージのstr_length()
関数等を使う。
基本的には、str_length()
関数を使うことが多い。
……なので、ここでは主にstr_length()
関数についてまとめておく。
str_length()
str_length(string)
- 引数
- string: 文字列または文字ベクトル。str_length()は、1つの文字列だけでなく、ベクトル(複数の文字列)にも対応している。
- 戻り値
- 各文字列の長さを整数ベクトルとして返す。
- 文字列がベクトルの場合は、それぞれの要素の長さが返される。
基本的な使い方
単一の文字列の長さを取得する
# 1つの文字列の長さを取得
str_length("こんにちは")
output
[1] 5
- これは、5文字(こ・ん・に・ち・は)なので、5が返される。
ベクトル内の複数の文字列の長さを取得する
# 1つの文字列の長さを取得
str_length(c("R", "Data Science", "こんにちは", "12345"))
output
[1] 1 12 5 5
- "R" の長さは 1
- "Data Science" の長さは 12(スペースも1文字としてカウント)
- "こんにちは" の長さは 5
- "12345" の長さは 5
NAを含む場合の動作
str_length()
は、NAの要素をNAとして返すのが特徴。
# NAを含む場合
str_length(c("R", NA, "こんにちは", "12345"))
output
[1] 1 NA 5 5
- NAの要素はNAとして返される。
ポイント:
NAを除外したい場合は、na.rm = TRUE
のようなオプションはないけれど、!is.na()
を使うことで回避できる。
str_length(c("Hello", NA, "World"))[!is.na(str_length(c("Hello", NA, "World")))]
output
[1] 5 5
空文字列の長さ
空文字列(""
)の長さは0になる。
str_length("")
output
[1] 0
- これは、0文字なので、0が返される。
nchar()との違い
文字数とバイト数の違い
baseのnchar()
とstr_length()
は、動作が似ているけれど、文字コード(UTF-8) を考慮するかどうかが違う。
マルチバイト文字が含まれる場合、nchar()はオプションのtype = "bytes"
を指定することで、バイト数を取得できる。
nchar("こんにちは", type = "bytes")
output
[1] 15
- 文字列「こんにちは」は、UTF-8では1文字あたり3バイト。
- したがって、5文字 × 3バイト = 15バイト となる。
ざっくりとまとめると、
str_length()
は、文字数を数える。nchar()
は、type="bytes"を使うとバイト数を数える。
という違いがある。
関数 | 動作 | NAの処理 | バイト数の計算 | ベクトル対応 |
---|---|---|---|---|
str_length() |
文字数をカウント | NAはそのままNA | ❌ (バイト数は取得不可) | ✅ 複数の文字列に対応 |
nchar() |
文字数 or バイト数 | NAはNA | ✅ (type="bytes"で可能) | ✅ 複数の文字列に対応 |
イメージとしては、
「str_length()はUTF-8を考慮して正しい文字数を返すので、基本的にはこれを使うのが良くて、nchar()
は、バイト数が必要な場合は、nchar()
のtype = "bytes"
で指定したり、特定の条件に応じてカスタマイズしたりする。」
といった感じ。
応用的な使い方
str_length()関数は、ただ文字列の長さを取得するだけではなく、フィルタリングやデータ処理に使うことで力を発揮する。
フィルターに使う
文字列の長さが3文字以上の要素をフィルターする
# 3文字以上の要素をフィルター
str_length(c("AI", "Tom", "Ann", "Samantha", "Joe", "John")) >= 3
output
[1] FALSE TRUE TRUE TRUE TRUE TRUE
- "AI" は2文字なので、フィルターから除外される。
文字数の合計を求める
文字ベクトル全体の合計の文字数を取得する
names <- c("Tom", "Ann" , "Samantha" , "Joe" , "AI" , "John" )
total_length <- sum(str_length(names))
print(total_length)
output
[1] 26
- 全体の文字数は、26文字。
文字数の平均を求める
文字ベクトル全体の平均の文字数を取得する
names <- c("Tom", "Ann" , "Samantha" , "Joe" , "AI" , "John" )
average_length <- mean(str_length(names))
print(average_length)
output
[1] 4.333333
- 全体の文字数は、26文字。
- 平均の文字数は、4.33文字。
文字数の最大値を求める
文字ベクトル全体の最大の文字数を取得する
names <- c("Tom", "Ann" , "Samantha" , "Joe" , "AI" , "John" )
max_length <- max(str_length(names))
print(max_length)
output
[1] 8
- 最大の文字数は、8文字。
文字数の最小値を求める
文字ベクトル全体の最小の文字数を取得する
names <- c("Tom", "Ann" , "Samantha" , "Joe" , "AI" , "John" )
min_length <- min(str_length(names))
print(min_length)
output
[1] 2
- 最小の文字数は、2文字。
文字列を長さの短い順に並べ替える
names <- c("Tom", "Ann" , "Samantha" , "Joe" , "AI" , "John" )
sorted_names <- names[order(str_length(names))]
print(sorted_names)
output
[1] "AI" "Tom" "Ann" "Joe" "John" "Samantha"
- 文字列を長さの短い順に並べ替える。
文字列を長さの長い順に並べ替える
names <- c("Tom", "Ann" , "Samantha" , "Joe" , "AI" , "John" )
sorted_names <- names[order(-str_length(names))]
print(sorted_names)
output
[1] "Samantha" "Tom" "Ann" "John" "Joe" "AI"
- 文字列を長さの長い順に並べ替える。
まとめ
str_length()
は、文字列の文字数を正確に取得する関数。- ベクトルにも対応しており、複数の文字列を一度に処理可能。
- マルチバイト文字(日本語)にも対応しているため、UTF-8環境では
nchar()
よりも直感的で使いやすい。
機能 | str_length() |
---|---|
文字列の長さ取得 | ✅ 取得可能 (UTF-8考慮) |
NAの処理 | ✅ NAはそのまま返す |
空文字の長さ | 0 (空文字列は長さ0) |
ベクトルの長さ | ✅ すべての要素の長さを返す |
日本語やマルチバイト対応 | ✅ 文字単位で正しくカウント |
バイト数のカウント | ❌ バイト数の取得はnchar() で |