Skip to content

Instantly share code, notes, and snippets.

  • Save HirofumiYashima/0d9a7457fce837d8fa8c to your computer and use it in GitHub Desktop.
Save HirofumiYashima/0d9a7457fce837d8fa8c to your computer and use it in GitHub Desktop.
データ欠落日のある日次データオブジェクトに、欠落日の行(年月日列以外のカラム値 0ゼロ)を一括挿入するR言語スクリプト
【問題設定】
データ欠落日のある日次データオブジェクトに、欠落日の行(年月日列以外のカラム値 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