日付を表す文字列を書式を整えて色々なやり方で表示するための 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"
要するに,入力文字列中の年・月・日の順序と表現法,出力文字列中の年・月・日の順序と表現法について,適切な関数(多くの方法に対応できる関数)を書けばよいわけである。