私はRを初めて使用しますが、処理しようとしている大きなデータセットの問題を解決するためにRを使用しました。現在、次のように、分間隔のタイムスタンプ(月/日/年時:分)(X値)に対して設定された4列のデータ(Y値)があります。
timestamp tr tt sr st
1 9/1/01 0:00 1.018269e+02 -312.8622 -1959.393 4959.828
2 9/1/01 0:01 1.023567e+02 -313.0002 -1957.755 4958.935
3 9/1/01 0:02 1.018857e+02 -313.9406 -1956.799 4959.938
4 9/1/01 0:03 1.025463e+02 -310.9261 -1957.347 4961.095
5 9/1/01 0:04 1.010228e+02 -311.5469 -1957.786 4959.078
私が持っている問題は、いくつかのタイムスタンプ値が欠落していることです-例えば。 9/1/01 0:13と9/1/01 0:27の間にギャップがある場合があり、そのようなギャップはデータセット全体で不規則です。これらのシリーズのいくつかを同じデータベースに配置する必要があります。欠損値はシリーズごとに異なるため、現在、日付は各行で一致していません。
これらの欠落しているタイムスタンプの行を生成し、Y列に空白値(ゼロではなくデータなし)を入力して、連続した時系列を作成します。
正直、どこから始めればいいのかよくわかりません(実際にRを使ったことがないので、学習しながら学習します!)。どんな助けでも大歓迎です。これまでにchronとZooをインストールしたことがあります。
ありがとう!
最も簡単なのは、すでに説明したように最初に日付を設定し、Zooに変換してから、マージを設定することです。
df$timestamp<-as.POSIXct(df$timestamp,format="%m/%d/%y %H:%M")
df1.Zoo<-Zoo(df[,-1],df[,1]) #set date to Index
df2 <- merge(df1.Zoo,zoo(,seq(start(df1.Zoo),end(df1.Zoo),by="min")), all=TRUE)
開始と終了はdf1(元のデータ)から指定され、例で必要なように、たとえばminで設定します。 all = TRUEは、欠落日付のすべての欠落値をNAに設定します。
これは古い質問ですが、同様の問題に対する答えを探しているときにこの投稿に出くわしたので、これを処理するdplyrの方法を投稿したかっただけです。私は、動物園のアプローチよりも目で見てより直感的で簡単だと感じています。
library(dplyr)
ts <- seq.POSIXt(as.POSIXct("2001-09-01 0:00",'%m/%d/%y %H:%M'), as.POSIXct("2001-09-01 0:07",'%m/%d/%y %H:%M'), by="min")
ts <- seq.POSIXt(as.POSIXlt("2001-09-01 0:00"), as.POSIXlt("2001-09-01 0:07"), by="min")
ts <- format.POSIXct(ts,'%m/%d/%y %H:%M')
df <- data.frame(timestamp=ts)
data_with_missing_times <- full_join(df,original_data)
timestamp tr tt sr st
1 09/01/01 00:00 15 15 78 42
2 09/01/01 00:01 20 64 98 87
3 09/01/01 00:02 31 84 23 35
4 09/01/01 00:03 21 63 54 20
5 09/01/01 00:04 15 23 36 15
6 09/01/01 00:05 NA NA NA NA
7 09/01/01 00:06 NA NA NA NA
8 09/01/01 00:07 NA NA NA NA
また、dplyrを使用すると、これらすべての欠損値を他の値に変更するなどの操作が簡単になります。これは、ggplotでプロットするときに役立ちました。
data_with_missing_times %>% group_by(timestamp) %>% mutate_each(funs(ifelse(is.na(.),0,.)))
timestamp tr tt sr st
1 09/01/01 00:00 15 15 78 42
2 09/01/01 00:01 20 64 98 87
3 09/01/01 00:02 31 84 23 35
4 09/01/01 00:03 21 63 54 20
5 09/01/01 00:04 15 23 36 15
6 09/01/01 00:05 0 0 0 0
7 09/01/01 00:06 0 0 0 0
8 09/01/01 00:07 0 0 0 0
日付パディングは、Rのpadr
パッケージに実装されています。データフレームを保存する場合、日時変数はPOSIXct
またはPOSIXlt
として保存されます。あなたがする必要があるのは:
library(padr)
pad(df_name)
動作については、vignette( "padr")またはこのブログ投稿を参照してください。
# some made-up data
originaldf <- data.frame(timestamp=c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:04"),
tr = rnorm(4,0,1),
tt = rnorm(4,0,1))
originaldf$minAsPOSIX <- as.POSIXct(originaldf$timestamp, format="%m/%d/%y %H:%M", tz="GMT")
# Generate vector of all minutes
ndays <- 1 # number of days to generate
minAsNumeric <- 60*60*24*243 + seq(0,60*60*24*ndays,by=60)
# convert those minutes to POSIX
minAsPOSIX <- as.POSIXct(minAsNumeric, Origin="2001-01-01", tz="GMT")
# new df
newdf <- merge(data.frame(minAsPOSIX),originaldf,all.x=TRUE, by="minAsPOSIX")
上記の方法で取得したNA値をゼロに置き換える場合は、次のようにします。
df[is.na(df)] <- 0
(元々はIbollarの回答についてこれをコメントしたかったのですが、必要な評判が足りなかったため、回答として投稿しました)
これは、complete
パッケージでtidyr
を使用することで実現できると思います。
_library(tidyverse)
df <- df %>%
complete(timestamp = seq.POSIXt(min(timestamp), max(timestamp), by = "minute"),
tr, tt, sr,st)
_
min(timestamp)
とmax(timestamp)
を使用する代わりに、開始日と終了日を初期化することもできます。
Rの時系列データの処理にはいくつかの進歩があります。 tsibble
パッケージ は、このような時系列操作を整然と追加しました。
library(tsibble)
library(lubridate)
ts <- lubridate::dmy_hm(c("9/1/01 0:00","9/1/01 0:01","9/1/01 0:03","9/1/01 0:27"))
originaldf <- tsibble(timestamp = ts,
tr = rnorm(4,0,1),
tt = rnorm(4,0,1),
index = timestamp)
originaldf %>%
fill_gaps()
df1.Zoo <- Zoo(df1[,-1], as.POSIXlt(df1[,1], format = "%Y-%m-%d %H:%M:%S")) #set date to Index: Notice that column 1 is Timestamp type and is named as "TS"
full.frame.Zoo <- Zoo(NA, seq(start(df1.Zoo), end(df1.Zoo), by="min")) # Zoo object
full.frame.df <- data.frame(TS = as.POSIXlt(index(full.frame.Zoo), format = "%Y-%m-%d %H:%M:%S")) # conver Zoo object to data frame
full.vancouver <- merge(full.frame.df, df1, all = TRUE) # merge
私は、データが月と日で失われたタイムスタンプを埋める代わりに、似たようなものを探していました。そこで、うるう年などに対応する月のシーケンスを生成したかったのです。私はlubridate
を使用しました:
date <- df$timestamp[1]
date_list <- c(date)
while (date < df$timestamp[nrow(df)]){
date <- date %m+% months(1)
date_list <- c(date_list,date)
}
date_list <- format(as.Date(date_list),"%Y-%m-%d")
df_1 <- data.frame(months=date_list, stringsAsFactors = F)
これにより、増分月の日付のリストが表示されます。それから私は参加します
df_with_missing_months <- full_join(df_1,df)