2013-10-07 35 views
3
start=as.Date("2013-09-02") 
x[1:140]<-start 
for(i in 2:140){ 
    x[i]<-x[i-1]+1 } 

我所得到的東西是這樣的:爲什麼所有日期字符串都變成數字?

[1] "2013-09-02" "2013-09-03" "2013-09-04" "2013-09-05" "2013-09-06"  

當我運行:

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

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

所有的字符串都變成數字,爲什麼我怎能不改變它們沿y ?

+1

,你可以避免用'for'循環創建日期向量,只需使用向量化的'+'和':'函數,如'start +(0:140)'; –

回答

6

問題是R不允許矩陣填充日期。 "matrix""Date"都是類。 R中Date對象的底層表示只是一個整數。因此,當您創建矩陣y時,它將從x(它是一個整數數組)中獲取底層數據,添加維度屬性,並生成"matrix"類。

這個問題沒有任何干淨的解決方法。儘管如此,你可以使用一些黑客技巧。例如,您可以明確強制y的類別爲"Date"以及"matrix"class(y)<-c("matrix","Date")y仍然會打印出來只是一個日期的載體,但你將能夠使用矩陣cordinates操縱它:

> 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元素,然後將它們轉換爲日期使用as.Date當你需要他們:

> 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" 
+0

+1的變通辦法。請記住''在R中Date對象的基本表示形式只是一個整數''也適用於因素,這在矩陣中是允許的 –

+0

@RicardoSaporta有趣的是,我沒有意識到在沒有黑客攻擊。你如何構建這樣一個矩陣?如果我執行'x <-sample(c(「a」,「b」,「c」),50,T); X <-as.factor(X); y <-matrix(x,10,5)'然後'mode(y)'返回'「character」'。如果我然後調用'y <-as.factor(y)',那麼'y'不再是一個矩陣。 – mrip

+0

我的錯誤。你是對的,他們被強制爲「人物」 –

1

這只是一個奇怪的行爲matrix。日期在內部存儲爲自1970年1月1日以來的天數的整數。這些是您所看到的數字。

可能最好的選擇是將它們存儲在數據框中。

僅供參考,您可以使用seq創建一個日期序列。

x <- seq(as.Date("2013-09-02"), length.out = 140, by = "1 day") 
+0

也許可以解釋一下'matrix '把所有東西都轉換成一個通用的類型,在日期的情況下,我相信它會使用'as.vector'來刪除日期屬性。 – A5C1D2H2I1M1N2O1R2T1

相關問題