如何避免在将日期格式的值赋给矩阵或数据框时被转换为数字?

25

我遇到了一个问题,但是我不理解它,也无法在这个网站上找到它的答案(我一直在找如何将日期转换为数字或反之的答案,但我真正想知道的是不要进行转换)。

问题是,当您将格式为日期的值(例如“20-09-1992”)分配给矩阵或数据框时,R会将其转换为数值。例如,我们有一个带有日期格式的“20-09-1992”,我们使用class()进行了检查。

as.Date("20-09-1992", format = "%d-%m-%Y")
class(as.Date("20-09-1992", format = "%d-%m-%Y"))

现在我们将这个值赋给一个矩阵,想象中称为Matrix:

Matrix <- matrix(NA,1,1)
Matrix[1,1] <- as.Date("20-09-1992", format = "%d-%m-%Y")
Matrix[1,1]
class(Matrix[1,1])

突然之间以前格式为“20-09-1992”的日期变成了一个数值,其值为8298。我不想要一个值为8298的数值,我想要一个看起来像“20-09-1992”这样的日期格式。

因此,我想知道这是否仅仅是R的工作方式,我们不允许将日期分配给矩阵和数据框(不知何故,我已经在其他矩阵/数据框中有日期,但是为什么那些时间不同呢?)是否有一种特殊的方法可以将日期分配给数据框和矩阵,而我错过了并且未能从以前(某些成功的)尝试中推断出来?


1
在R中,matrix函数会从输入向量中提取所有属性。这在?matrix中有详细说明:“可选的数据向量(包括列表或表达式向量)。非原子类R对象通过as.vector强制转换,并丢弃所有属性”。如果您运行attributes(as.Date("20-09-1992", format = "%d-%m-%Y")),您会发现class是一个属性。当类被剥离时,Date向量就会回到它的存储模式,即storage.mode(as.Date("20-09-1992", format = "%d-%m-%Y"))。还可以参见unclass(as.Date("20-09-1992", format = "%d-%m-%Y")) - David Arenburg
谢谢!还有另一个评论也谢谢! - Joes de Natris
3个回答

10

我认为你无法在矩阵中存储日期。请使用数据框或数据表。如果您必须在矩阵中存储日期,则可以使用列表矩阵。

Matrix <- matrix(NA,1,1)
Matrix[1,1] <- as.list(as.Date("20-09-1992", format = "%d-%m-%Y"),1)
Matrix
[[1]]
[1] "1992-09-20"

修改后:我刚刚重新阅读了你与数据框架的问题,我不确定原因。

mydate<-as.Date("20-09-1992", format = "%d-%m-%Y")
mydf<-data.frame(mydate)
mydf

      mydate
1 1992-09-20

编辑:这对我来说是一个关于R和日期的学习经验。显然,您提供的日期已转换为自原点以来的天数。原点定义为1970年1月1日。要在某个时候将其转换回日期格式

Matrix
     [,1]
[1,] 8298

as.Date(Matrix, origin ="1970-01-01")
[1] "1992-09-20" 

2
非常感谢!我找到了一个解决方法(将日期存储为字符,然后在调用循环或函数中的字符时更改格式为as.date),lubridate听起来就像我需要更简单地完成这个任务的工具!所以,再次感谢! - Joes de Natris

6

请尝试以下步骤:首先指定您的日期向量,然后使用

rownames(mat) <- as.character(date_vector)

日期将会以文本形式显示。

-1

这通常发生在我们加载Excel工作簿时

您需要在函数中添加detectDates = TRUE

DataFrame <- read.xlsx("File_Nmae", sheet = 3, detectDates = TRUE)

抱歉,这并不是所问的问题。对不起。 - AleRuete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接