Как добавить только отсутствующие даты в Dataframe R - PullRequest
0 голосов
/ 05 мая 2018

У меня есть ниже упомянутый фрейм данных:

Date        Val1     Val2
2018-04-01  125      0.05
2018-04-03  458      2.99
2018-04-05  354      1.25

Я хочу добавить только отсутствующие даты, учитывая Sys.Date() (здесь, например, Sys.Date() - 2018-04-06) в кадре данных с соответствующими значениями val1 и val2 как 0.

Я пробовал: t2<-merge(data.frame(Date= seq(min(ymd(t1$Date)), max(ymd(date)), by = "days")), t1, by = "Date", all = TRUE)

Обязательный фрейм данных:

Date        Val1     Val2
2018-04-01  125      0.05
2018-04-02  0        0
2018-04-03  458      2.99
2018-04-04  0        0
2018-04-05  354      1.25
2018-04-06  0        0

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Вы можете использовать padr. padr предназначен для заполнения пропущенных значений даты. Сначала вы добавляете недостающие даты на основе интервала, и, если вы не хотите, чтобы NA соответствовал, вы заполняете их значением (или функцией наибольшего значения)

edit: добавлен end_val для включения прогона до sys.Date ()

library(padr)
# Specify end_val to go all the way to sys.Date and add 1 to include sys.Date
padded_df <- pad(df, interval = "day", end_val = Sys.Date()+1)
padded_df <- fill_by_value(padded_df, value = 0)
padded_df

        Date Val1 Val2
1 2018-04-01  125 0.05
2 2018-04-02    0 0.00
3 2018-04-03  458 2.99
4 2018-04-04    0 0.00
5 2018-04-05  354 1.25
.....

31 2018-05-01    0    0
32 2018-05-02    0    0
33 2018-05-03    0    0
34 2018-05-04    0    0
35 2018-05-05    0    0
36 2018-05-06    0    0
0 голосов
/ 05 мая 2018

Вот исправление вашего подхода в базе R.

Замените max(t1$Date) на Sys.Date() в вашем реальном приложении:

t2<-merge(data.frame(Date= as.Date(min(t1$Date):max(t1$Date),"1970-1-1")),
          t1, by = "Date", all = TRUE)
t2[is.na(t2)] <- 0

#         Date Val1 Val2
# 1 2018-04-01  125 0.05
# 2 2018-04-02    0 0.00
# 3 2018-04-03  458 2.99
# 4 2018-04-04    0 0.00
# 5 2018-04-05  354 1.25

Данные

t1 <- read.table(text="Date        Val1     Val2
'2018-04-01'  125 0.05
'2018-04-03'  458 2.99
'2018-04-05'  354 1.25",h=T,strin=F)
t1$Date <- as.Date(df$Date)
0 голосов
/ 05 мая 2018

Это можно сделать с помощью complete

library(tidyverse)
df1 %>%
    complete(Date = seq(Date[1], Sys.Date(), by = "1 day"),
                fill = list(Val1 = 0, Val2 = 0))

Если нам нужно передать несколько переменных для fill, создайте список столбцов, который нам нужен для fill

nm1 <- setdiff(names(df1), "Date") #in this example excluding the Date
nm2 <- setNames(as.list(rep(0, length(nm1))), nm1)

и затем передать это в качестве аргумента для fill

df1 %>% 
     complete(Date = seq(Date[1], Sys.Date(), by = "1 day"), fill = nm2)
# A tibble: 35 x 3
#   Date        Val1  Val2
#   <date>     <dbl> <dbl>
# 1 2018-04-01   125  0.05
# 2 2018-04-02     0  0   
# 3 2018-04-03   458  2.99
# 4 2018-04-04     0  0   
# 5 2018-04-05   354  1.25
# 6 2018-04-06     0  0   
# 7 2018-04-07     0  0   
# 8 2018-04-08     0  0   
# 9 2018-04-09     0  0   
#10 2018-04-10     0  0   
# ... with 25 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...