为什么列表中的日期在强制转换为字符时首先转换为数字

时间:2017-11-22 20:14:36

标签: r string date

我正在尝试将一列日期转换为字符串,因为我想在我的代码中稍后使用它们作为因子级别。

日期列是tibble的一部分,属于Date类。我认为一个简单的as.character()转换可以解决问题,但不幸的是我错了。它不是格式整齐的字符串,而是以字符串形式返回一个数字。例如,今天(2017年11月22日)将出现为“17492”。因此,在此过程中,日期将转换为数字格式,然后才变为字符串。

现在我确实找到了一种解决方法,通过取消列出数据,再将其转换为日期然后转换为字符串,但效率相当低。

任何人都可以解释为什么会发生这种情况,以及ii)是否有更容易解决的问题?

以下是可重现的例子:

#Get current system date
foo <-Sys.Date()
#Convert to list
foo <- as.list(foo)
#The following then produces the number string:
as.character(foo)
[1] "17492"
#The following code works but is a rather annoying work-around
as.character(as.Date(unlist(foo), origin=as.Date("1970-01-01")))
[1] "2017-11-22"

1 个答案:

答案 0 :(得分:1)

鉴于有用评论的数量和提供的最终解决方案,我将在此处发布答案摘要。

如果您遇到此问题,首先要做的是检查您是否确实想要转换完整列表,或者列表中的列,其中列实际上是向量。正如MrFlick和neilfws指出的那样,这是我的根本问题。我错过的原因是因为在我的情况下,列表是一列tibble,列被命名为&#34; date&#34;。使用as.character(foo)返回了我的&#34;数字字符串&#34; "17492",但使用as.character(foo$date),完全按照预期执行并返回"2017-11-22"

如果你的列表实际上只是一个列表或一个列表列表,那么d.b的解决方案。像微风一样:根据您想要的输出使用lapply(foo, as.character)sapply(foo, as.character)

现在,为什么会发生这种情况:正如d.b.所指出的直接原因。如果as.character()遇到一个列表,它首先unlist(),然后进行转换。

joran指出了更深层次的原因以及here上的重复问题。简而言之:通常将完整列表转换为单个数据类型类是没有意义的,因为它可以包含许多。例如,as.numeric(foo)只会返回错误。唯一的例外是as.character(),它实际上完全写出了列表(可能是为了保存记录)。