R 为什么在强制转换为字符时列表中的日期首先转换为数字
我正试图将一列日期转换为字符串,因为我想在代码的后面某个时候将它们用作因子级别 日期列是TIBLE的一部分,属于类日期。我认为简单的as.character()转换就可以了,但不幸的是我错了。它以字符串形式返回数字,而不是格式整齐的字符串。例如,今天(2017年11月22日)的名称为“17492”。因此,在这个过程的某个地方,日期被转换成数字格式,然后才变成字符串 现在我确实找到了一个解决办法,通过取消数据列表,再次将其转换为日期,然后再转换为字符串,但效率相当低 有人能解释i)为什么会发生这种情况,以及ii)是否有更简单的解决方法吗 下面是一个可复制的示例:R 为什么在强制转换为字符时列表中的日期首先转换为数字,r,string,date,R,String,Date,我正试图将一列日期转换为字符串,因为我想在代码的后面某个时候将它们用作因子级别 日期列是TIBLE的一部分,属于类日期。我认为简单的as.character()转换就可以了,但不幸的是我错了。它以字符串形式返回数字,而不是格式整齐的字符串。例如,今天(2017年11月22日)的名称为“17492”。因此,在这个过程的某个地方,日期被转换成数字格式,然后才变成字符串 现在我确实找到了一个解决办法,通过取消数据列表,再次将其转换为日期,然后再转换为字符串,但效率相当低 有人能解释i)为什么会发生这种
#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"
#获取当前系统日期
foo鉴于大量有用的评论和提供的最终解决方案,我将在这里发布一个答案摘要
如果遇到此问题,首先要做的是检查是否确实要转换完整列表,或列表中的一列,而该列实际上是一个向量。正如Flick和neilfws所指出的,这是我的根本问题。我之所以没有看到,是因为在我的例子中,列表是一列tibble,列名为“date”。使用as.character(foo)
返回了我的“数值字符串”“17492”
,但使用as.character(foo$date)
,做了它应该做的事情,并返回了“2017-11-22”
如果您的列表实际上只是一个列表或列表列表,那么d.b.的解决方案就像微风一样:使用lappy(foo,as.character)
或sappy(foo,as.character)
,具体取决于您所需的输出
至于发生这种情况的原因:正如d.b.所指出的,直接原因是,如果as.character()
遇到一个列表,它首先unlist()
它,然后进行转换
乔兰指出了更深层次的原因,以及关于这个问题的重复问题。简言之:通常将完整列表转换为单个数据类型类是没有意义的,因为它可以包含许多数据类型。例如,as.numeric(foo)
只会返回一个错误。唯一的例外是as.character()
,它实际上是对列表进行完整的写入(可能是为了保留记录)。lappy(foo,as.character)
在示例中,将日期存储在列表中而不是简单的向量中有什么原因吗?通常,TIBLES中的列存储为向量。你重复的例子是否准确地反映了你真正的问题?@d.b很好,谢谢。工作起来很轻松。至于“为什么”,在列表中使用As.character
,这是一个普遍的问题,不必特别考虑日期。我试图找到一个非常好的副本…似乎基本问题是运行as.character(foo)
其中foo是一个1列TIBLE与as.character(foo$date)
不同。