Предполагая, что результат должен начинаться с первого числа месяца первой даты и заканчиваться последней датой, а фрейм входных данных DF
, воспроизводимый в конце примечания, преобразуется DF
вобъект зоопарка z
, создайте сетку дат g
, объедините их, чтобы получить объекты зоопарка z0
(с нулевым заполнением) и zz
(с заполнением na.locf) и при желании преобразуйте обратно во фреймы данных или просто оставьтеэто как есть, поэтому вы можете использовать zoo для дальнейшей обработки.
library(zoo)
z <- read.zoo(DF, header = TRUE, format = "%m/%d/%Y")
g <- seq(as.Date(as.yearmon(start(z))), end(z), "day")
z0 <- merge(z, zoo(, g), fill = 0) # zero filled
zz <- na.locf0(merge(z, zoo(, g))) # na.locf filled
# optional
DF0 <- fortify.zoo(z0) # zero filled
DF2 <- fortify.zoo(zz) # na.locf filled
data.table
В вопросе упоминаются таблицы данных, и если это относится к пакету data.table, добавьте:
library(data.table)
DT0 <- data.table(DF0) # zero filled
DT2 <- data.table(DF2) # na.locf filled
Вариации
Мне не было ясно, спрашивал ли вопрос о заполненном нулями ответе и na.locf
заполненном ответе или просто na.locf
заполненномответ, чьи оставшиеся значения NA заполнены 0, но принят первый случай.Если вы хотите заполнить НС, оставленные в na.locf
заполненном ответе, добавьте:
zz[is.na(zz)] <- 0
Если вы хотите закончить в конце прошлого месяца, а не впоследнюю дату замените end(z)
на as.Date(as.yearmon(end(z)), frac = 1)
.
Если вы хотите начать с первого числа, а не с первого числа месяца первого числа, замените as.Date(as.yearmon(start(z)))
на start(z)
.
В качестве альтернативы (3), чтобы начать с первой даты и закончить с последней, мы могли бы просто преобразовать в ts
и обратно.Обратите внимание, что нам нужно восстановить класс Date
во второй строке ниже, поскольку класс ts
не может напрямую обрабатывать класс Date
.
z2.na <- as.zoo(as.ts(z))
time(z2.na) <- as.Date(time(z2.na))
zz20 <- replace(z2.na, is.na(z2.na), 0) # zero filled
zz2 <- na.locf0(z2.na) # na.locf filled
Примечание
Lines <- "
Date Data
1/5/1980 25
1/7/1980 30
2/13/1980 44
4/13/1980 50"
DF <- read.table(text = Lines, header = TRUE)