文字列の処理

文字列の長さを取得

  • str_length(文字列)
stringr::str_length("あいうえお12345")
[1] 10

文字列が条件に合致するかチェック

  • str_detect(“文字列”, pattern = “正規表現”) : 正規表現にマッチした部分が含まれているか否かを判定
    • dplyr::filter 関数などで利用できる
stringr::str_detect("あいうえお12345", "あ")
[1] TRUE
stringr::str_detect("あいうえお12345", "[0-9]") # 数字
[1] TRUE

文字列の指定条件での分割

  • str_split(“文字列”, pattern = “正規表現”) : 正規表現にマッチした 部分で文字列を分割
stringr::str_split("東京都港区三田", "都|区") # 正規表現の|はorの意味
[[1]]
[1] "東京" "港"   "三田"

文字列の結合

  • str_c(“文字列”, “文字列”) : 文字列を結合
    • sep オプションを指定すれば、区切り文字を指定可
  • str_glue(“文字列”) : 文字列内に {変数} という形で変数を挿入できる
stringr::str_c("今の日時", lubridate::now(), sep = ": ")
[1] "今の日時: 2023-07-17 10:01:18.08186"
stringr::str_glue("今の日時: {lubridate::now()}")
今の日時: 2023-07-17 10:01:18.127982

paste, paste0 との違い

  • 文字列を結合する際、従来は paste( ), paste0( ) 関数を用いた
    • 結合時に区切り文字が入るのがpaste()、入らないのがpaste0()
  • paste, paste0 は NAも結合するが、stringr::str_cはNAが一つでも含まれれば、結合をやめてNAだけを返す
paste("東京", NA, "三田", sep = "_")
[1] "東京_NA_三田"
stringr::str_c("東京", NA, "三田", sep = "_")
[1] NA

文字列の位置による抽出

  • str_sub(“文字列”, start = 開始位置, end = 終了位置) : 文字列の一部を抽出
    • 位置の値をマイナスにすれば、後ろから数えることができる
stringr::str_sub(c("千代田区", "中央区", "港区"), start = 1, end = -2)
[1] "千代田" "中央"   "港"    

文字列の条件による抽出

  • str_subset(“文字列”, pattern = “正規表現”) : 正規表現にマッチした文字列全体抽出
stringr::str_subset(c("千代田区", "中央区", "港区", "武蔵野市", "立川市"), ".*区")
[1] "千代田区" "中央区"   "港区"    
  • str_extract_all(“文字列”, pattern = “正規表現”) : 正規表現にマッチした部分全て抽出
    • 最初の部分だけ抽出する場合はstr_extract (_allは不要)
    • dplyr::mutate関数内で使うのは、上記のstr_subsetではなくこの関数
city <- tibble::tibble(city = c("千代田区", "中央区", "港区", "武蔵野市", "立川市"))

city |> 
    dplyr::mutate(city_name = stringr::str_extract(city, ".*区"))
  • str_replace_all(“文字列”, pattern = “正規表現”, replacement = “置換後”) : 正規表現にマッチした部分全て置換
    • str_replace_all(“文字列”, c(“置換前” = “置換後”, “置換前” = “置換後”)) のように記述すれば複数指定可
    • 最初の部分だけ置換する場合はstr_replace (_allは不要)
city <- tibble::tibble(city = c("千代田区", "中央区", "港区", "武蔵野市", "立川市"))

city |> 
    dplyr::mutate(center_name = stringr::str_replace_all(city, "区|市", "支店"))
  • str_remove_all(“文字列”, pattern = “正規表現”) : 正規表現にマッチした部分を全て削除
city <- tibble::tibble(city = c("千代田区", "中央区", "港区", "武蔵野市", "立川市"))

city |> 
    dplyr::mutate(city_name = stringr::str_remove_all(city, "区|市"))

文字列の空白の除去・整理

  • str_trim(“文字列”, side = “both”) : 文字列の左右の空白を除去
    • コピペしてきたデータの整理に便利
stringr::str_trim("  あいうえお 12345 ")
[1] "あいうえお 12345"
  • str_pad(“文字列”, 桁L, side = “left”, “埋める文字”) : 文字数を揃える
stringr::str_pad(
    c("1", "10", "100"),
    width = 3, # 揃える桁数
    pad = "0" # 埋め合わせに使う文字
)
[1] "001" "010" "100"

文字列の繰り返し

  • str_dup(“文字列”, 回数) : 指定回数だけ文字列を繰り返す
for(i in 1:5){
    stringr::str_dup("A", i) |> 
        print()
}
[1] "A"
[1] "AA"
[1] "AAA"
[1] "AAAA"
[1] "AAAAA"

文字列の大文字・小文字の変換

  • str_to_lower(“文字列”) : 文字列を全て小文字に変換
stringr::str_to_lower("R PACKAGES FOR DATA SCIENCE")
[1] "r packages for data science"
  • str_to_upper(“文字列”) : 文字列を全て大文字に変換
stringr::str_to_upper("R packages for data science")
[1] "R PACKAGES FOR DATA SCIENCE"
  • str_to_sentence(“文字列”) : 文頭を大文字に
stringr::str_to_sentence("see how the tidyverse makes data science faster,")
[1] "See how the tidyverse makes data science faster,"
  • str_to_title(“文字列”) : 各単語の頭文字を大文字に
stringr::str_to_title("R packages for data science")
[1] "R Packages For Data Science"

zipanguパッケージ

  • zipangu パッケージを使えば、日本語文字列を効率的に処理できる

住所の分割

  • 住所の分割 : separate_address()
    • 住所が完全でない場合、不足する部分には NA が挿入される
    separate_address("東京都港区三田2丁目15−45")
    ## 結果は下記の通り
    # $prefecture
    # [1] "東京都"
    # $city
    # [1] "港区"
    # $street
    # [1] "三田2丁目15−45"

暦や文字種の変換

  • 和暦 → 西暦 に変換 : zipangu::convert_jyear()
zipangu::convert_jyear("平成12年")
[1] 2000
  • 漢数字 → アラビア数字に変換 : zipangu::kansuji2arabic_all()
zipangu::kansuji2arabic_all("平成一三年一月一六日")
[1] "平成13年1月16日"
  • ひらがな <–> カタカナ に変換 : zipangu::str_conv_hirakana()
zipangu::str_conv_hirakana("カスミガセキ", to = "hiragana")
[1] "かすみがせき"
  • 全角文字 <–> 半角文字 に変換 : zipangu::str_conv_zenhan()
zipangu::str_conv_zenhan("千代田区霞が関2-1-2", "hankaku")
[1] "千代田区霞が関2-1-2"
  • Unicode 文字の正規化 : zipangu::str_conv_normalize()
zipangu::str_conv_normalize("①A") 
[1] "1A"
  • 第x曜日の日付を取得する : zipangu::find_date_by_wday() -*wdayは日曜日が 1-
zipangu::find_date_by_wday(year = 2020, month = 1, wday = 2, ordinal = 2) # 2020年1月の第2月曜日
[1] "2020-01-13"
  • 都道府県名の正規化・簡略化 : zipangu::harmonize_prefecture_name()
zipangu::harmonize_prefecture_name(c("東京", "北海道", "京都"), to = "long")
[1] "東京都" "北海道" "京都府"
zipangu::harmonize_prefecture_name(c("東京都", "北海道", "京都府"), to = "short")
[1] "東京"   "北海道" "京都"  
  • その日が祝日かどうかを調べる : zipangu::is_jholiday()
zipangu::is_jholiday(date = as.Date("2021-07-23")) # TRUE
[1] TRUE
  • 年を指定して、その年の祝日一覧を取得可能 : zipangu::jholiday(年)
zipangu::jholiday(2020, lang = "jp")
$元日
[1] "2020-01-01"

$成人の日
[1] "2020-01-13"

$建国記念の日
[1] "2020-02-11"

$天皇誕生日
[1] "2020-02-23"

$春分の日
[1] "2020-03-20"

$昭和の日
[1] "2020-04-29"

$憲法記念日
[1] "2020-05-03"

$みどりの日
[1] "2020-05-04"

$こどもの日
[1] "2020-05-05"

$海の日
[1] "2020-07-23"

$スポーツの日
[1] "2020-07-24"

$山の日
[1] "2020-08-10"

$敬老の日
[1] "2020-09-21"

$秋分の日
[1] "2020-09-22"

$文化の日
[1] "2020-11-03"

$勤労感謝の日
[1] "2020-11-23"
  • 年と祝日の名前を指定して、該当日を出力可能 : zipangu::jholiday_spec(年, “祝日名”)
zipangu::jholiday_spec(2010, "海の日", lang = "jp")
[1] "2010-07-19"