日付を表す文字列を書式を整えて色々なやり方で表示するための as.Date 関数であるが,色々な状況下においては正しく機能しない。
> d <- c("21-Dec-99", "3-Mar-06") > d [1] "21-Dec-99" "3-Mar-06" > as.Date(d) 以下にエラーfromchar(x) : 文字列は標準的な曖昧さのない書式にはなっていません > as.Date(d, format="%b %d, %Y") [1] NA NAそのようなときには,入力文字列と出力文字列が決まっていれば as.Date 関数を再定義してしまうというのも適切な選択であることもある。
"9-Dec-99", "10-Dec-99" のような日付形式(日を表す最初の数値が一桁の場合も二桁の場合もある)を "1999/12/25" に変換する場合
as.Date <- function(str, format="%4i/%02i/%02i") { result <- matrix(unlist(strsplit(str, "-")), 3) d <- as.integer(result[1,]) m <- charmatch(result[2,], month.abb) y <- as.integer(result[3,]) y <- ifelse(y < 10, y+2000, y+1900) sprintf(format, y, m, d) } > as.Date(c("21-Dec-99", "3-Mar-06")) [1] "1999/12/21" "2006/03/03"
また,"09-Dec-99", "10-Dec-99" のような日付形式(日を表す最初の数値が必ず二桁の場合)を "1999/12/25" に変換する場合
as.Date <- function(str, format="%s %02i, %4i") { d <- as.integer(substring(str, 1, 2)) m <- substring(str, 4, 6) y <- as.integer(substring(str, 8, 9)) y <- ifelse(y < 10, y+2000, y+1900) sprintf(format, m, d, y) } > as.Date(c("21-Dec-99", "03-Mar-06")) [1] "Dec 21, 1999" "Mar 03, 2006"
要するに,入力文字列中の年・月・日の順序と表現法,出力文字列中の年・月・日の順序と表現法について,適切な関数(多くの方法に対応できる関数)を書けばよいわけである。