2

日付を操作すると、R で通常のトリックを使用できないことにすでに数回気付きました。日付を含むデータフレーム データ (以下を参照) があり、完全なデータフレームを日付クラスに変換したいとします。今まで思いついた唯一の解決策は次のとおりです。

for (i in 1:ncol(Data)){
    Data[,i] <- as.Date(Data[,i],format="%d %B %Y")
}

これにより、正しい構造のデータフレームが得られます。

> str(Data)
'data.frame':   6 obs. of  4 variables:
 $ Rep1:Class 'Date'  num [1:6] 12898 12898 13907 13907 13907 ...
 $ Rep2:Class 'Date'  num [1:6] 13278 13278 14217 14217 14217 ...
 $ Rep3:Class 'Date'  num [1:6] 13600 13600 14340 14340 14340 ...
 $ Rep4:Class 'Date'  num [1:6] 13831 13831 14669 14669 14669 ...

従来の適用アプローチを使用すると、まったく異なる結果が得られます。すべての変数は同じクラスであり、同じクラスに移動しますが、出力として正しいクラスのデータ フレームまたはマトリックスを取得できません。

> str(sapply(Data,as.Date,format="%d %B %Y"))
 num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"
> str(apply(Data,2,as.Date,format="%d %B %Y"))
 num [1:6, 1:4] 12898 12898 13907 13907 13907 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:4] "Rep1" "Rep2" "Rep3" "Rep4"

これらの行列を Date オブジェクトに再度変換する場合は、オリジンが必要です。その起源はシステムごとに異なる可能性があるため、 as.Date または apply() の後に別の関数を使用してもあまり役に立ちません。原点を適用すると、再びベクトルが得られます。

この種のデータのクリーンなソリューションはありますか? 以下は、例で使用したデータフレームです。

Data <- structure(list(Rep1 = c(" 25 April 2005 ", " 25 April 2005 ", 
" 29 January 2008 ", " 29 January 2008 ", " 29 January 2008 ", 
" 29 January 2008 "), Rep2 = c(" 10 May 2006 ", " 10 May 2006 ", 
" 4 December 2008 ", " 4 December 2008 ", " 4 December 2008 ", 
" 4 December 2008 "), Rep3 = c(" 28 March 2007 ", " 28 March 2007 ", 
" 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 ", " 6 April 2009 "
), Rep4 = c(" 14 November 2007 ", " 14 November 2007 ", " 1 March 2010 ", 
" 1 March 2010 ", " 1 March 2010 ", " 1 March 2010 ")), .Names = c("Rep1", 
"Rep2", "Rep3", "Rep4"), row.names = c("1", "2", "3", "4", "5", 
"6"), class = "data.frame")
4

2 に答える 2

5

これを行う最も簡潔な方法は次のとおりです。

Data[] <- lapply(Data, as.Date,format="%d %B %Y")

これは、すべての列が日付ではない場合にもうまく一般化されます。

Data[date_col] <- lapply(Data[date_col], as.Date,format="%d %B %Y")

他のいくつかのパッケージを使用して、日付の解析を簡略化することもできます

library(stringr)
library(lubridate)
Data[] <- lapply(Data, function(x) dmy(str_trim(x)))

これはもう少し冗長ですが、データ形式を自分で理解する必要がないという利点があります。

于 2010-08-30T16:23:53.590 に答える
3

どうですか

str(as.data.frame(lapply(Data,as.Date,format="%d %B %Y")))
# 'data.frame':   6 obs. of  4 variables:
#  $ Rep1:Class 'Date'  num [1:6] 12898 12898 13907 13907 13907 ...
#  $ Rep2:Class 'Date'  num [1:6] 13278 13278 14217 14217 14217 ...
#  $ Rep3:Class 'Date'  num [1:6] 13600 13600 14340 14340 14340 ...
#  $ Rep4:Class 'Date'  num [1:6] 13831 13831 14669 14669 14669 ...
于 2010-08-30T11:32:07.280 に答える