问题: 如何将factor
类型的数据转换为date
类型的对象而不产生NA
值。
这里有一篇类似的帖子:在R中将Factor类型数据转换为Date/Time类型数据
在那篇文章中,用户在将数据转换成date
类型之前先将其转换成了character
类型。使用as.character
函数将数据转换成character
类型后,在as.Date
函数内部进行操作时会出现NA
值。
我有一个包含日期的列,以factor格式存储在数据框中,具有不同的出现次数。下面是数据框中包含的信息:
> head(fraud, 5)
TRANSACTION.DATE TRANSACTION.AMOUNT AIR.TRAVEL.DATE POSTING.DATE
1 2/27/14 25.00 <NA> 2/28/14
2 2/28/14 25.00 <NA> 2/28/14
3 2/27/14 25.00 <NA> 2/28/14
4 2/27/14 20.00 2/27/14 2/28/14
5 2/27/14 12.13 <NA> 2/28/14
> str(fraud$TRANSACTION.DATE)
Factor w/ 519 levels "1/1/14","1/1/15",..: 228 230 228 228 228 230 226 228 230 228 ...
> summary(fraud$TRANSACTION.DATE, 5)
9/30/14 9/17/14 11/4/14 9/23/14 (Other)
197 187 171 160 19221
将因子转换为日期对象导致了
NA
值的产生。> fraud$TRANSACTION.DATE <- as.Date(as.character(fraud$TRANSACTION.DATE),
+ format = "%m/%d/%Y")
> head(fraud$TRANSACTION.DATE, 5)
[1] NA NA NA NA NA
检查 as.character
函数是否有效。
> fraud$TRANSACTION.DATE <- as.character(fraud$TRANSACTION.DATE)
> head(fraud$TRANSACTION.DATE)
[1] NA NA NA NA NA NA
编辑:我使用了as.Date函数,但却得到了错误的格式
> fraud$TRANSACTION.DATE <- as.Date(fraud$TRANSACTION.DATE, format = "%m/%d/%Y")
> str(fraud$TRANSACTION.DATE)
Date[1:19936], format: "0014-02-27" "0014-02-28" "0014-02-27" "0014-02-27" "0014-02-27" ...
> head(fraud$TRANSACTION.DATE, 5)
[1] "0014-02-27" "0014-02-28" "0014-02-27" "0014-02-27" "0014-02-27"
EDIT 2: 这是dput值
> dput(droplevels(head(fraud$TRANSACTION.DATE)))
structure(c(1L, 2L, 1L, 1L, 1L, 2L), .Label = c("2/27/14", "2/28/14"
), class = "factor")
解决方案:使用%y代替%Y。
> fraud$TRANSACTION.DATE <- as.Date(fraud$TRANSACTION.DATE, "%m/%d/%y")
> head(fraud$TRANSACTION.DATE, 5)
[1] "2014-02-27" "2014-02-28" "2014-02-27" "2014-02-27" "2014-02-27"
$d
而不是%d
。另外,只需要使用as.Date
函数即可,即可能不需要使用as.character
。例如:as.Date(fraud$TRANSACTION.DATE, '%m/%d/%y')
将会输出以下结果:"2014-02-27" "2014-02-28" "2014-02-27" "2014-02-27" "2014-02-27"。 - akrundput(droplevels(head(fraud)))
. - akrunfactor
列,而不需要转换为character
,效果很好。我正在使用R 3.2.1。 - akrunas.character()
,因为对于类“factor”,有一个S3方法可以有效地为你调用as.Date(as.character(x))
。 - Gavin Simpsonstrftime()
以获取详细信息。但请注意,您希望将其保留为“Date”对象,并仅在需要绘图或输出表格时进行格式化。 - Gavin Simpson