2016-12-02 1 views
1

Я хотел бы расширить свой фрейм данных на основе столбца Date, чтобы в хронологическом порядке между моими текущими датами были новые строки дат. Столбец «Дата» хронологический, длится 5 лет и содержит повторяющиеся даты, которые я бы хотел игнорировать. Я хотел бы, чтобы соответствующие строки Group и Draw новых строк были «NA».Развернуть dataframe с последовательными датами на основе столбца дат в R

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, и я пытаюсь сделать это вручную.

ответ

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)] 
+0

Спасибо, это работает очень хорошо. Я бы обновил ваш ответ, чтобы добавить библиотеку (data.table), так как это не сработало для меня, пока я не нашел этот пакет. Еще раз спасибо @nrussell – lg929

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 выше на вашей таблице данных.

+0

Для этого я не смог бы установить весь диапазон дат, потому что в моем примере есть несколько повторяющихся дат. @kquach – lg929

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