【问题标题】:Why are dates in a list first converted to numeric when coercing to character为什么在强制转换为字符时列表中的日期首先转换为数字
【发布时间】:2018-05-06 16:39:54
【问题描述】:

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

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

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

谁能解释一下 i) 为什么会发生这种情况以及 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"

【问题讨论】:

  • lapply(foo, as.character)
  • 您将日期存储在列表中而不是示例中的简单向量中是否有原因?通常,小标题中的列存储为向量。您的可重现示例是否准确反映了您的实际问题?
  • @d.b 太好了,谢谢。像微风一样工作。
  • 至于“为什么”,在列表中使用as.character 是很普遍的事情,与日期无关。我正在尝试找到一个非常好的副本...
  • 似乎基本问题是运行 as.character(foo) (其中 foo 是 1 列小标题)与 as.character(foo$date) 不同。

标签: r string date


【解决方案1】:

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

如果您遇到此问题,首先要做的是检查您是否真的要转换完整列表,或者 列表中的列,该列实际上是一个向量。正如 MrFlick 和 neilfws 指出的那样,这是我的根本问题。我错过的原因是因为在我的情况下,该列表是一个单列标题,该列被命名为“日期”。使用 as.character(foo) 返回了我的“数字字符串”"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(),它实际上会完整地写出列表(可能是为了保留记录)。

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多