ケィオスの時系列解析メモランダム

時系列解析、生体情報解析などをやわらかく語ります

【Rで文字列操作】Rの基本命令の整理

 私は、ファイル名に含まれるID番号や日付情報を抽出したり、入力ファイル名を参考にして出力ファイル名を自動で設定したりするときに、文字列操作系の命令(関数)をよく使用します。しかし、命令の使い方をよく忘れてしまうため、今回は文字列操作系の命令を整理しました。

イラストレータで自動生成した「ハサミと糊」の奇妙なイラスト

1. 文字列の結合・書式指定・整形

単純結合 paste / paste0

 複数の文字列(例:日本食名)を連結するための基本関数です。

paste

 引数同士を連結する際、デフォルトで空白または指定した区切り文字を挿入します。

paste("sushi", "ramen")           # "sushi ramen"
paste("sushi", "ramen", sep="-")   # "sushi-ramen"

paste0

 区切り文字を挿入せずにそのまま連結します。

paste0("sushi", "ramen")           # "sushiramen"

書式指定して穴埋め sprintf

 書式指定に従った文字列を生成します。   

sprintf("sushi price is %d yen", 100)   # "sushi price is 100 yen"

フォーマット指定子

 以下は、R の sprintf 関数で用いるフォーマット指定子とその指定方法をまとめた表です。

フォーマット指定子 説明 出力結果
%d / %i 10 進数の整数 sprintf("%d", 42) "42"
%f 固定小数点数表記(例では.2で小数点以下の桁数を指定) sprintf("%.2f", 3.14159) "3.14"
%e 指数表記(小文字) sprintf("%.2e", 3.14159) "3.14e+00"
%E 指数表記(大文字) sprintf("%.2E", 3.14159) "3.14E+00"
%g 値の大きさに応じて %f または %e を自動選択 sprintf("%g", 3.14159) "3.14159"
%G 値の大きさに応じて %F または %E を自動選択 sprintf("%G", 3.14159) "3.14159"
%s 文字列 sprintf("%s", "sushi") "sushi"
%o 8 進数表記 sprintf("%o", 10) "12"
%x 16 進数表記(小文字) sprintf("%x", 255) "ff"
%X 16 進数表記(大文字) sprintf("%X", 255) "FF"
%c 単一の文字(整数値を文字コードとみなして変換) sprintf("%c", 65) "A"

桁数の指定

 幅6桁で右寄せ(空白で埋める)

sprintf("%6d", 42)          # "    42"

ゼロを埋める指定

sprintf("%06d", 42)          # "000042"

書式整形 format / formatC

 数値や日付などを文字列に変換する際の表示形式を調整します。

数値の場合

format(1234.567, digits = 3)
formatC(1234.567, format = "f", digits = 2)  # "1234.57"

日付変数の操作

 DatePOSIXct オブジェクトの年月日や時分秒を取り出して、指定の形式で文字列化することも可能です。

d <- as.Date("2025-02-23")
format(d, "%Y年%m月%d日")   # "2025年02月23日"
format(d, "%Y-%m-%d")           # "2025-02-23"
format(d, "%d/%m/%Y")           # "23/02/2025"
format(d, "%B %d, %Y")            # "February 23, 2025"

日時表示形式指定 strftime

 POSIXctだけでなく、POSIXltの日時データのフォーマットを変えるときは、strftime() を使います。

# POSIXct オブジェクトの作成
dt <- as.POSIXct("2025-02-23 14:30:45")

# フォーマットの適用
strftime(dt, "%Y/%m/%d %H:%M:%S")  # "2025/02/23 14:30:45"
strftime(dt, "%A, %B %d, %Y")      # "日曜日, 2月 23, 2025"

Windowsで、曜日や月の表記を英語にしたいとき、Sys.setlocale("LC_TIME", "C")を使えば英語表示にできました。

Sys.setlocale("LC_TIME", "C")
strftime(dt, "%A, %B %d, %Y")      # "Sunday, February 23, 2025"

フォーマット指定一覧

以下の表は、format()strftime() で使用できる書式指定子をまとめたものです。

指定子 説明 例 (2025-02-23 14:30:45) 出力例
日付関連
%Y 西暦 (4桁) format(d, "%Y") "2025"
%y 西暦 (下2桁) format(d, "%y") "25"
%m 月 (2桁) format(d, "%m") "02"
%B 月の名前 (英語, フル) format(d, "%B") "February"
%b 月の名前 (英語, 省略形) format(d, "%b") "Feb"
%d 日 (2桁) format(d, "%d") "23"
%e 日 (1桁の場合スペースパディング) format(d, "%e") "23"
%j 年内の通算日 format(d, "%j") "054"
曜日関連
%A 曜日 (英語, フル) format(d, "%A") "Sunday"
%a 曜日 (英語, 省略形) format(d, "%a") "Sun"
%u 曜日 (1=月曜, 7=日曜) format(d, "%u") "7"
%w 曜日 (0=日曜, 6=土曜) format(d, "%w") "0"
時刻関連
%H 時 (24時間表記, 2桁) format(dt, "%H") "14"
%I 時 (12時間表記, 2桁) format(dt, "%I") "02"
%M 分 (2桁) format(dt, "%M") "30"
%S 秒 (2桁) format(dt, "%S") "45"
%p AM/PM 表記 (英語) format(dt, "%p") "PM"
タイムゾーン関連
%Z タイムゾーンの名前 format(dt, "%Z") "UTC" (例)
%z タイムゾーンUTCオフセット format(dt, "%z") "+0000" (例)
その他
%c ロケールに応じた日時の標準表記 format(dt, "%c") "Sun Feb 23 14:30:45 2025"
%x ロケールに応じた日付の表記 format(d, "%x") "02/23/25" (ロケール依存)
%X ロケールに応じた時刻の表記 format(dt, "%X") "14:30:45"

2. 文字列の長さ、抽出、および分割

長さ nchar

 文字列中の文字数(長さ)を返します。

nchar("sushi")   # 5

抽出 substr / substring

 文字列の一部分を抜き出すための関数です。

substr(x, start, stop)

 文字列 x の指定位置を抜き出します。

substr("sushiramen", 2, 4)   # "ush"

substring

 開始位置から末尾まで(または複数の開始位置を指定)を抜き出します。

substring("sushiramen", 3)   # "shiramen"

分割 strsplit

 指定した区切り文字または正規表現パターンに基づいて文字列を分割し、リストとして返します。

strsplit("sushi,ramen,tempura", ",")   # list(c("sushi", "ramen", "tempura"))

3. 正規表現を用いた検索・抽出

位置検索 grep / grepl

 正規表現パターンに基づき、日本食名のベクトルから一致する要素を検索します。

grep("a", c("tempura", "udon", "soba"))   # 例:tempura と soba に "a" が含まれるため、インデックスが返る
grepl("a", c("tempura", "udon", "soba"))   # TRUE, FALSE, TRUE

4. 文字列の置換

置換 sub / gsub

 正規表現に基づき、日本食名内の部分文字列を置換します。

sub: 最初にマッチした部分のみを置換します。

sub("a", "A", "karaage")   # "karaage" の最初の "a" が大文字に → "kAraage"

gsub: マッチしたすべての部分を置換します。

gsub("a", "A", "karaage")  # 全ての "a" が大文字に → "kArAAge"

5. 文字の変換

変換 chartr

 一文字単位で変換を行い、指定した文字群を別の文字群に一括置換します。
例として、"takoyaki" の中で "t", "a", "k" を大文字に変換する場合:

chartr("tak", "TAK", "takoyaki")   # "takoyaki" → "TAKOyAKi"

大小文字変換 toupper / tolower

 文字列全体を大文字または小文字に変換します。

toupper("sashimi")   # "SASHIMI"
tolower("TEMPURA")   # "tempura"

6. テキストの整形

strwrap

 長い文字列(例:複数の日本食名が並んだ文字列)を指定した幅で折り返して整形表示します。

strwrap("sushi ramen tempura udon soba yakitori sashimi", width = 20)

7. ファイルパスの操作

ファイル名抽出 basename

 指定したファイルパスからファイル名部分(最後の要素)を抽出します。

basename("sushi/ramen/tempura.txt")   # "tempura.txt"

ディレクトリ抽出 dirname

 指定したファイルパスからディレクトリ部分を抽出します。

dirname("sushi/ramen/tempura.txt")    # "sushi/ramen"

最後に一言

 私が使用したことのある命令のみをまとめました。他にも命令があるかもしれません。便利な命令をご存じでしたら、ぜひ教えてください。

 Rで処理をすべて自動化するには、式の計算だけでなく、日付の処理や、今回紹介した文字列操作のコマンドを使いこなす必要があります。複数のファイルを扱う場合は、自動処理できるようにRスクリプトを書くと作業時間を大幅に短縮できます。