Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为什么在强制转换为字符时列表中的日期首先转换为数字_R_String_Date - Fatal编程技术网

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

R 为什么在强制转换为字符时列表中的日期首先转换为数字,r,string,date,R,String,Date,我正试图将一列日期转换为字符串,因为我想在代码的后面某个时候将它们用作因子级别 日期列是TIBLE的一部分,属于类日期。我认为简单的as.character()转换就可以了,但不幸的是我错了。它以字符串形式返回数字,而不是格式整齐的字符串。例如,今天(2017年11月22日)的名称为“17492”。因此,在这个过程的某个地方,日期被转换成数字格式,然后才变成字符串 现在我确实找到了一个解决办法,通过取消数据列表,再次将其转换为日期,然后再转换为字符串,但效率相当低 有人能解释i)为什么会发生这种

我正试图将一列日期转换为字符串,因为我想在代码的后面某个时候将它们用作因子级别

日期列是TIBLE的一部分,属于类日期。我认为简单的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"
#获取当前系统日期

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)
不同。