as.Date 関数の再定義     Last modified: Mar 03, 2006

日付を表す文字列を書式を整えて色々なやり方で表示するための 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"

要するに,入力文字列中の年・月・日の順序と表現法,出力文字列中の年・月・日の順序と表現法について,適切な関数(多くの方法に対応できる関数)を書けばよいわけである。


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh