R logo

文字列の中の文字数をカウントする方法としては、R標準パッケージ(base)に含まれるnchar()関数や、stringrパッケージのstr_length()関数等を使う。

基本的には、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()