R 为什么所有日期字符串都更改为数字?

R 为什么所有日期字符串都更改为数字?,r,R,当我跑步时: [1] "2013-09-02" "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06" y [,1] [,2] [,3] [,4] [,5] [,6] [,7] [1,] 15950 15951 15952 15953 15954 15955 15956 所有的字符串都变成了数字,为什么?我怎么能不在y中改变它们呢?这只是矩阵的一种奇怪行为。日期在内部存储为自1970年1月1日以来天数的整数。这些是你看

当我跑步时:

[1] "2013-09-02" "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06"    
y
[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
[1,] 15950 15951 15952 15953 15954 15955 15956   

所有的字符串都变成了数字,为什么?我怎么能不在y中改变它们呢?

这只是
矩阵的一种奇怪行为。日期在内部存储为自1970年1月1日以来天数的整数。这些是你看到的数字

也许最好的选择是将它们存储在数据帧中

仅供参考,您可以使用
seq
创建日期序列

y<-matrix(x,nrow=20,byrow=TRUE) 
> y

   [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
 [1,] 15950 15951 15952 15953 15954 15955 15956   

x问题是R不允许用日期填充矩阵。
“矩阵”
“日期”
都是类。R中日期对象的底层表示形式只是一个整数。因此,当您创建矩阵
y
时,它从
x
中获取基础数据(这是一个整数数组),添加维度属性,并使类
成为“矩阵”


没有任何干净的方法可以解决这个问题。不过,你可以使用一些技巧。例如,您可以显式强制
y
为类
“日期”
以及
“矩阵”
,使用
类(y)可以避免
For
循环创建日期向量,只需使用向量化的
+
函数,如
开始+(0:140)
;)也许可以解释一下,
matrix
是如何将所有内容转换为通用类型的,对于日期,我相信它会使用
as.vector
来删除日期属性。解决方法是+1。请记住,
“R中日期对象的底层表示形式只是一个整数”
也适用于在R中允许的因子matrices@RicardoSaporta有趣的是,我不知道矩阵中的因子是允许的。你如何构造这样一个矩阵?如果我执行
x
y<-matrix(x,nrow=20,byrow=TRUE) 
> y

   [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]
 [1,] 15950 15951 15952 15953 15954 15955 15956   
x <- seq(as.Date("2013-09-02"), length.out = 140, by = "1 day")
> class(y)<-c("matrix","Date")
> head(y)
 [1] "2013-09-02" "2013-09-09" "2013-09-16" "2013-09-23" "2013-09-30"
 [6] "2013-10-07" "2013-09-03" "2013-09-10" "2013-09-17" "2013-09-24"
[11] "2013-10-01" "2013-10-08" "2013-09-04" "2013-09-11" "2013-09-18"
[16] "2013-09-25" "2013-10-02" "2013-10-09" "2013-09-05" "2013-09-12"
[21] "2013-09-19" "2013-09-26" "2013-10-03" "2013-10-10" "2013-09-06"
[26] "2013-09-13" "2013-09-20" "2013-09-27" "2013-10-04" "2013-10-11"
[31] "2013-09-07" "2013-09-14" "2013-09-21" "2013-09-28" "2013-10-05"
[36] "2013-10-12" "2013-09-08" "2013-09-15" "2013-09-22" "2013-09-29"
[41] "2013-10-06" "2013-10-13"
> y[1,]
[1] "2013-09-02" "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06"
[6] "2013-09-07" "2013-09-08"
> y[1,]<-y[1,]+1
> y[1,]
[1] "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06" "2013-09-07"
[6] "2013-09-08" "2013-09-09"
> y<-data.frame(y)
> y<-data.frame(lapply(y,function(x) {class(x)<-"Date";x}))
> head(y)
          X1         X2         X3         X4         X5         X6         X7
1 2013-09-02 2013-09-03 2013-09-04 2013-09-05 2013-09-06 2013-09-07 2013-09-08
2 2013-09-09 2013-09-10 2013-09-11 2013-09-12 2013-09-13 2013-09-14 2013-09-15
3 2013-09-16 2013-09-17 2013-09-18 2013-09-19 2013-09-20 2013-09-21 2013-09-22
4 2013-09-23 2013-09-24 2013-09-25 2013-09-26 2013-09-27 2013-09-28 2013-09-29
5 2013-09-30 2013-10-01 2013-10-02 2013-10-03 2013-10-04 2013-10-05 2013-10-06
6 2013-10-07 2013-10-08 2013-10-09 2013-10-10 2013-10-11 2013-10-12 2013-10-13
> y<-matrix(as.character(x),nrow=20,byrow=T)
> head(y)
     [,1]         [,2]         [,3]         [,4]         [,5]        
[1,] "2013-09-02" "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06"
[2,] "2013-09-09" "2013-09-10" "2013-09-11" "2013-09-12" "2013-09-13"
[3,] "2013-09-16" "2013-09-17" "2013-09-18" "2013-09-19" "2013-09-20"
[4,] "2013-09-23" "2013-09-24" "2013-09-25" "2013-09-26" "2013-09-27"
[5,] "2013-09-30" "2013-10-01" "2013-10-02" "2013-10-03" "2013-10-04"
[6,] "2013-10-07" "2013-10-08" "2013-10-09" "2013-10-10" "2013-10-11"
     [,6]         [,7]        
[1,] "2013-09-07" "2013-09-08"
[2,] "2013-09-14" "2013-09-15"
[3,] "2013-09-21" "2013-09-22"
[4,] "2013-09-28" "2013-09-29"
[5,] "2013-10-05" "2013-10-06"
[6,] "2013-10-12" "2013-10-13"
> as.Date(y[1,])
[1] "2013-09-02" "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06"
[6] "2013-09-07" "2013-09-08"