【发布时间】:2015-10-19 07:28:41
【问题描述】:
问题:如何在不获取 NA 值的情况下将 factor 转换为 date 对象。
这是一个类似的帖子:Convert Factor to Date/Time in R
在那篇文章中,用户在date 之前转换为character 对象。在as.Date 函数中使用as.character 转换为character 对象时,我得到NA 值。
我在数据框中有一列,其日期采用因子格式,出现次数不同。这是data.frame中包含的信息。
> 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
将因子转换为date 对象会产生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"
编辑 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') #[1] "2014-02-27" "2014-02-28" "2014-02-27" "2014-02-27" "2014-02-27" -
一个 dput 输出可能更具重现性。即
dput(droplevels(head(fraud))) -
@BenjaminHofner 我确实尝试过使用
factor列,它在没有转换为character的情况下运行良好。我正在使用 R 3.2.1 -
@BenjaminHofner 你不需要
as.character(),因为"factor"类有一个S3 方法,它有效地为你调用as.Date(as.character(x))。 -
@ScottDavis 要格式化日期(R 将使用 YYYY-MM-DD 进行 显示),请查看
strftime()了解详细信息。但请注意,您希望将其保留为"Date"对象,并且仅在需要绘图或在您输出的表格中进行格式化。
标签: r date time-series