日付に基づいてデータフレームを拡張したい列に、現在の日付の間に時系列で日付の新しい行があるようにします。 [日付]列は時系列で、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に。