Created
May 9, 2014 06:28
-
-
Save HirofumiYashima/0d9a7457fce837d8fa8c to your computer and use it in GitHub Desktop.
データ欠落日のある日次データオブジェクトに、欠落日の行(年月日列以外のカラム値 0ゼロ)を一括挿入するR言語スクリプト
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
【問題設定】 | |
データ欠落日のある日次データオブジェクトに、欠落日の行(年月日列以外のカラム値 0ゼロ)を一括挿入するR言語スクリプト | |
(データ例) | |
<データ期間> 1980年1月1日~2013年12月31日 | |
<データ欠落日> 1980年1月1日, 1980年1月2日,1980年1月7日, 1980年1月8日,1980年1月9日・・・ | |
<データ形式> (1列目) YYYY-MM-DD , (2列目) 数値 ※カンマ区切り | |
【欠落行(欠落日のデータ行)を一括挿入する方法】 | |
(1) Rにログデータを読み込む | |
(2) ダミーのデータ・マトリクスを作成する | |
(1列目:YYYY-MM-DD ※データ開始日~データ終了日まで、すべての年月日 | |
2列目:任意の数字、文字列 ※ 0(ゼロ)、NA(not applicable)、NULLなど何でも良い。作業(5)で削除する。 | |
(3) (1)で読み込んだデータと、(2)で作成したマトリクスを完全外部結合でマージする(関数:merge()) | |
(4) マージした結果、以下のデータオブジェクトが生成される。 | |
(1列目:YYYY-MM-DD ※データ開始日~データ終了日まで、すべての年月日 | |
2列目:0(ゼロ) または NA または NULL ※(2)で設定した値 | |
3列目: 元データ((1)で最初に読み込んだデータ)に存在していた日付行 ⇒ 元データの値 | |
元データで欠けていた日付行 ⇒ NA (「NA」の2文字が、merge()関数の完全外部結合設定での実行によって、自動挿入される) | |
(5) 2列目は不要な行なので、削除する | |
(6) 必要に応じて、3列目のNA文字列を、0(数字のゼロ)や、任意の数値に一括置換する | |
(※ 時系列折れ線グラフなどのグラフを作成したり、時系列データ解析用の関数を実行する場合、 | |
NAが含まれているとエラーになる関数が多々あるため) | |
【Rのコード例】 | |
``{r fig.width=20, fig.height=15, warning=FALSE, echo=TRUE} | |
# 作業(1) Rにデータを読み込む | |
### 例)【読み込むファイル名】ファイル名 / 【R上のデータオブジェクト名】 log_data) | |
log_data <- read.csv(' ファイル名 ', header=F) | |
# 作業(2) ダミーのデータマトリクスの作成 | |
## ダミーデータの1列目に格納するための日付文字列ベクトルを作成。(※ log_dataの「データ開始日~データ終了日」まで、途中、欠落日のない日付ベクトル) | |
### str()関数で、データの開始日と終了日を確認する | |
str(log_data) | |
### seq()関数で、log_dataの「データ開始日~データ終了日」まで、途中、欠落日のない日付ベクトルを作成する | |
### 例) データオブジェクト名:hiduke データ開始日:1980年1月1日 / データ終了日: 2013年12月31日 | |
hiduke <- seq(as.Date("1980-01-01"), as.Date("2013-12-31"), by="days") | |
### オブジェクトのデータ型をcharacter型に型変換 | |
hiduke <- as.character(hiduke) | |
### ダミー・データマトリクスの行数(=データの全日数)を算出 | |
### データ開始日からデータ終了日までの経過日数に、データ開始日の1日分を加えた数字なので、 | |
### 下記で算出した日数を、変数 rownum に格納する。 | |
rownum <- as.numeric(as.Date("2013-12-31") - as.Date("1980-01-01")) + 1 | |
### ダミー・データマトリクスの作成 | |
dummy <- matrix(nrow=rownum,ncol=2) | |
### 日付データを格納できるように、matrix型からdataframe型にデータ型を変換 | |
dummy <- as.data.frame(dummy_matrix) | |
### 作成したダミー・データマトリクスの1列目に、hidukeベクトルを格納 | |
dummy[, 1] <- hiduke | |
### ダミー・データに、適当な列名をつける | |
colnames(dummy) <- c("date", "dummy_value") | |
### 作業(1)で読み込んだ元データにも、適当な列名をつける | |
### ※このとき、日付が格納されている1列目の列名を、ダミーデータの1列目(日付列)と同じ列名にする | |
colnames(log_data) <- c("date","value") | |
# 作業(3) 元データ を ダミーデータ とデータ結合させる | |
## 例)【結合データのオブジェクト名】log_data_edited | |
log_data_edited <- merge(dummy, log_data, by="date",all=T) | |
## by="date"で、date列での結合を指定 | |
## all=Tで、log_dataとdummyデータのうち、片方にしか存在しないデータ行(日付行)を、結合の結果 作成されるデータオブジェクトに含めることを指定 | |
# 作業(5) 2列目( dummy_value列 ) は不要な列なので、列全体を削除する | |
log_data_edited <- log_data_edited[ ,-2] | |
## log_data_edited[ , -(マイナス)2]で、log_data_editedから2列目を削除したデータを、log_data_editedに格納している | |
# 必要に応じて、3列目のNA文字列を、0(数字のゼロ)や、任意の数値に一括置換する | |
log_data_edited[is.na(log_data_edited)] <- 0 | |
## log_data_edited[is.na(log_data_edited)] で、log_data_editedのなかでNAのデータ箇所が選択される。 | |
## それらのデータ箇所に、0(ゼロ)を代入している。 | |
``` | |
上記の結果、求めていた以下のデータが手に入った。 | |
<データ期間> 1980年1月1日~2013年12月31日 | |
<データ欠落日> なし | |
<データ形式> (1列目) YYYY-MM-DD , (2列目) 数値 ※カンマ区切り |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment