Заполните отсутствующую дату и заполните данными выше - PullRequest
0 голосов
/ 06 марта 2019

Я достаточно исследовал, пока не спрошу об этом здесь, но не могли бы вы помочь мне с некоторыми идеями по этому вопросу?

Моя таблица данных (df) выглядит так:

client id   value    repmonth
123          100     2012-01-31
123          200     2012-02-31
123          300     2012-05-31

Поэтому у меня 2 пропущенных месяца. И я хочу, чтобы моя таблица данных выглядела так:

client id   value    repmonth
123          100     2012-01-31
123          200     2012-02-31
123          200     2012-03-31
123          200     2012-04-31
123          300     2012-05-31

Код должен заполнить пропущенное повторение и заполнить строки последним значением, в данном случае 200 и пришедшим идентификатором клиента.

Я пробовал следующее:

zoo library 
tidyr library 
dlpyr library 
posixct

Что касается кодов: ... множество сбоев

library(tidyr)
df %>%
  mutate (repmonth = as.Date(repmonth)) %>%
  complete(repmonth = seq.Date(min(repmonth), max(repmonth),by ="month"))

или

library(dplyr)

df$reportingDate.end.month <- as.POSIXct(df$datetime, tz = "GMT")
df <- tbl_df(df)   

list_df <- list(df, df)    # fake list of data.frames
seq_df <- data_frame(datetime = seq.POSIXt(as.POSIXct("2012-01-31"), 
                                           as.POSIXct("2018-12-31"), 
                                           by="month"))

lapply(list_df, function(x){full_join(total_loan_portfolios_3$reportingDate.end.month, seq_df, by=reportingDate.end.month)})

total_loan_portfolios_3$reportingmonth_notmissing <- full_join(seq_df,total_loan_portfolios_3$reportingDate.end.month)

или

library(dplyr)

ts <- seq.POSIXt(as.POSIXct("2012-01-01",'%d/%m/%Y'), as.POSIXct("2018/12/01",'%d/%m/%Y'), by="month")

ts <- seq.POSIXt(as.POSIXlt("2012-01-01"), as.POSIXlt("2018-12-01"), by="month")
ts <- format.POSIXct(ts,'%d/%m/%Y')

df <- data.frame(timestamp=ts)

total_loan_portfolios_3 <- full_join(df,total_loan_portfolios_3$Reporting_date)

Наконец, у меня много ошибок, таких как

формат не дата

или

Ошибка в seq.int (r1 $ mon, 12 * (to0 $ year - r1 $ year) + to0 $ mon, by):
'from' должно быть конечным числом

и другие.

1 Ответ

0 голосов
/ 06 марта 2019

В следующем решении используются пакеты lubridate и tidyr.Обратите внимание, что в примере OP даты искажены, но подразумевают наличие данных с вводом последнего дня месяца, поэтому попытайтесь повторить их здесь.Решение создает последовательность дат от минимальной даты ввода до максимальной даты ввода, чтобы получить все возможные месяцы интереса.Обратите внимание, что входные даты нормализованы к первому дню месяца, чтобы обеспечить правильную генерацию последовательности.После создания последовательности выполняется объединение влево для объединения имеющихся у нас данных и идентификации отсутствующих данных.Затем fill () применяется к столбцам для заполнения пропущенных NA.

library(lubridate)
library(tidyr)
#Note OP has month of Feb with 31 days... Corrected to 28 but this fails to parse as a date
df <- data.frame(client_id=c(123,123,123),value=c(100,200,300),repmonth=c("2012-01-31","2012-02-29","2012-05-31"),stringsAsFactors = F)

df$repmonth <- ymd(df$repmonth) #convert character dates to Dates
start_month <- min(df$repmonth)
start_month <- start_month - days(day(start_month)-1) #first day of month to so seq.Date sequences properly

all_dates <- seq.Date(from=start_month,to=max(df$repmonth),by="1 month")
all_dates <- (all_dates %m+% months(1)) - days(1) #all end-of-month-day since OP suggests having last-day-of-month input?
all_dates <- data.frame(repmonth=all_dates)
df<-merge(x=all_dates,y=df,by="repmonth",all.x=T)

df <- fill(df,c("client_id","value"))

Выход решения:

> df
    repmonth client_id value
1 2012-01-31       123   100
2 2012-02-29       123   200
3 2012-03-31       123   200
4 2012-04-30       123   200
5 2012-05-31       123   300
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...