/ / Rの日付の列に基づいて連続した日付でデータフレームを展開します-r、date、na、expand

R - r、日付、na、展開の日付の列に基づいて順次日付でデータフレームを展開

日付に基づいてデータフレームを拡張したい列に、現在の日付の間に時系列で日付の新しい行があるようにします。 [日付]列は時系列で、5年間にわたって実行され、無視したい重複した日付が含まれています。新しい行の対応するグループ行と描画行を「NA」にします。

zz <- "Date Group Draw
1  2006-05-11    bb     T
2  2006-05-11    bb     F
3  2006-05-14    aa     T
4  2006-05-16    aa     T
5  2006-05-20    cc     F
6  2006-05-20    bb     F
7  2006-05-21    aa     T"

Data <- read.table(text=zz, header = TRUE)

したがって、新しいデータフレームは次のようになります。

xx <- "Date Group Draw
1  2006-05-11    bb     T
2  2006-05-11    bb     F
3  2006-05-12    NA     NA
4  2006-05-13    NA     NA
5  2006-05-14    aa     T
6  2006-05-15    NA     NA
7  2006-05-16    aa     T
8  2006-05-17    NA     NA
9  2006-05-18    NA     NA
10 2006-05-19    NA     NA
11 2006-05-20    cc     F
12 2006-05-20    bb     F
13 2006-05-21    aa     T"

Output <- read.table(text=xx, header = TRUE)

どんな助けでも本当にありがたいです。私はRを初めて使用し、これを手動で実行しようとしています。

回答:

回答№1の場合は3

私はこれがうまくいくはずだと思います:

merge(
x = data.frame(
Date = seq.Date(min(df$Date), max(df$Date), by = "day")
),
y = df,
all.x = TRUE
)
#          Date Group  Draw
# 1  2006-05-11    bb  TRUE
# 2  2006-05-11    bb FALSE
# 3  2006-05-12  <NA>    NA
# 4  2006-05-13  <NA>    NA
# 5  2006-05-14    aa  TRUE
# 6  2006-05-15  <NA>    NA
# 7  2006-05-16    aa  TRUE
# 8  2006-05-17  <NA>    NA
# 9  2006-05-18  <NA>    NA
# 10 2006-05-19  <NA>    NA
# 11 2006-05-20    cc FALSE
# 12 2006-05-20    bb FALSE
# 13 2006-05-21    aa  TRUE

これは、実際のデータの範囲にまたがる日付シーケンスを作成してから、左結合を実行するだけです。


そして同じ考えを使用して data.table

dt[dt[,.(Date = seq.Date(min(Date), max(Date), by = "day"))], on = .(Date)]
#           Date Group  Draw
#  1: 2006-05-11    bb  TRUE
#  2: 2006-05-11    bb FALSE
#  3: 2006-05-12    NA    NA
#  4: 2006-05-13    NA    NA
#  5: 2006-05-14    aa  TRUE
#  6: 2006-05-15    NA    NA
#  7: 2006-05-16    aa  TRUE
#  8: 2006-05-17    NA    NA
#  9: 2006-05-18    NA    NA
# 10: 2006-05-19    NA    NA
# 11: 2006-05-20    cc FALSE
# 12: 2006-05-20    bb FALSE
# 13: 2006-05-21    aa  TRUE

zz <- "Date Group Draw
1  2006-05-11    bb     T
2  2006-05-11    bb     F
3  2006-05-14    aa     T
4  2006-05-16    aa     T
5  2006-05-20    cc     F
6  2006-05-20    bb     F
7  2006-05-21    aa     T"

df <- read.table(
text = zz,
header = TRUE
)
df$Date <- as.Date(df$Date)

library(data.table)
dt <- data.table(read.table(text = zz, header = TRUE))[,Date := as.Date(Date)]

回答№2の場合は1

@nrussellの投稿からのデータを使用して、別のオプションは complete から tidyr

library(tidyr)
complete(df, Date = full_seq(Date, 1))
## A tibble: 13 × 3
#         Date  Group  Draw
#       <date> <fctr> <lgl>
#1  2006-05-11     bb  TRUE
#2  2006-05-11     bb FALSE
#3  2006-05-12     NA    NA
#4  2006-05-13     NA    NA
#5  2006-05-14     aa  TRUE
#6  2006-05-15     NA    NA
#7  2006-05-16     aa  TRUE
#8  2006-05-17     NA    NA
#9  2006-05-18     NA    NA
#10 2006-05-19     NA    NA
#11 2006-05-20     cc FALSE
#12 2006-05-20     bb FALSE
#13 2006-05-21     aa  TRUE

回答№3の場合は0

私があなたの質問を正しく理解しているなら、これが私の大雑把な見解です:

date  <- format(seq.Date(from=as.Date(paste(2006, "05", "11", sep="-"),
"%Y-%m-%d"),
to  =as.Date(paste(2006, 05, "21", sep="-"),
"%Y-%m-%d"),
by  = "day"), "%Y-%m-%d")

上記は日付のリストを生成します。次に、の左結合を使用できます。 date 上記のdata.tableに。