2016-04-02 6 views
0

いくつかの製品を購入した日付の範囲があります。私は、製品と日付を関連付ける一種のピボットテーブルを作成しますが、何も販売されなかった日付があります。欠落した日付を見つけ出し、メインデータフレームに追加することもできますが、問題は日付形式を維持する代わりに、整数形式(整数から始点までの距離)を採用し、注文できないことです。私が使用しているコードはこれです:カラム名を日付として指定することはできません

upper.bound<- paste("01", month[1], 2013, sep="-") 
    lower.bound <- paste("30", month[4], 2013, sep="-") 

    dates <- seq(as.Date(upper.bound, "%d-%m-%Y"), as.Date(lower.bound, "%d-%m-%Y"), "days") 

    diff <- setdiff(dates, as.Date(colnames(export_f_ub), "%Y-%m-%d")) 

    len <- dim(as.matrix(diff))[1]*11 

    aux <- data.frame() 
    aux <- seq(0,0,length.out=len) 
    dim(aux) <- c(11, dim(as.matrix(diff))[1]) 
    col_dates <- as.Date(diff, origin="1970-01-01") 
    colnames(aux)<- c(col_dates) 

これがゼロに行列を設定し、メイン1にバインドするためのトライアウトました。しかし、結果として列名を数値として取得する場合と同様に、これは機能しません。ここでは、コンソールのスクリーンショットです:

Console log

+2

質問に関連するコードの部分を再現性のあるものにしておき、残しておいてもよろしいですか? – mtoto

答えて

0

私は誰かが行列の列名としてDateベクトルを割り当てようと見たことがありません。ディメンション名は常に文字列でなければならないので、一般的にこれはあなたがするべきことではありません。

言い換えれば、Rの列名代入機構がDateの文字をas.character()の行に沿って文字に強制してしまうため、直感的な期待が得られます。その基礎となる二重値の文字列ではなく、日付のテキスト表現

`colnames<-`()を行列に呼び出すと、`dimnames<-`()が呼び出され、.Primitive("dimnames<-")を実行してCコードにドロップされます。私は実際にCの実装を調べていませんが、ある時点でDateベクトルの基礎となる値doubleを取り出し、それらを文字に変換すると推測できます。そのため、列名として数字が使用されます。

ここで正しいアプローチは名前を割り当てるときas.character()を自分で呼び出すことです:

col_dates <- as.Date(c('2013-06-03','2013-06-04','2013-06-05','2013-06-06','2013-06-08','2013-06-22','2013-07-07','2013-07-08','2013-07-11','2013-07-13','2013-07-23','2013-07-25','2013-07-26','2013-08-27','2013-09-03','2013-09-04','2013-09-05','2013-09-06','2013-09-07','2013-09-09','2013-09-10','2013-09-11','2013-09-13','2013-09-14','2013-09-15','2013-09-16','2013-09-18','2013-09-20','2013-09-21','2013-09-22','2013-09-24','2013-09-30')); 
aux <- matrix(0,11L,length(col_dates)); 
colnames(aux) <- as.character(col_dates); 
aux; 
##  2013-06-03 2013-06-04 2013-06-05 2013-06-06 2013-06-08 2013-06-22 2013-07-07 2013-07-08 2013-07-11 2013-07-13 2013-07-23 2013-07-25 2013-07-26 2013-08-27 2013-09-03 2013-09-04 2013-09-05 2013-09-06 2013-09-07 2013-09-09 2013-09-10 2013-09-11 2013-09-13 2013-09-14 2013-09-15 2013-09-16 2013-09-18 2013-09-20 2013-09-21 2013-09-22 2013-09-24 2013-09-30 
## [1,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [2,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [3,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [4,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [5,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [6,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [7,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [8,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [9,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [10,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 
## [11,]   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0 

しかし、あなたは列名がDateクラスや内部表現を保持していないことに注意する必要があります(二重の値を参照) ;それらは純粋な文字列です。列名からDateベクトルを再作成する場合は、as.Date()まで実行する必要があります。

ところで、ベクトルxdim(as.matrix(x))[1]は、不要なラウンドアバウトウェイのlength(x)です。

+0

ありがとう、これは問題の半分を解決しました!唯一の問題は、このテーブルをメインテーブルにバインドできますが、日付順に並べることができないことです。私はこのxDに取り組んでいます –

関連する問題