在数据框中为缺失的日期插入行

3

I have a data frame as follows:

> head(train)
      S    D       Date
1     1    1 2010-02-05
2     1    1 2010-02-12
3     1    1 2010-02-19

日期列每周只有一个日期,对于每个现有的日期,我想插入6行以填补之后缺失的所有日期。

所以最终结果应该如下:

> head(train)
      S    D       Date
1     1    1 2010-02-05
1     1    1 2010-02-06 <- inserted
1     1    1 2010-02-07 <- inserted
1     1    1 2010-02-08 <- inserted
1     1    1 2010-02-09 <- inserted
1     1    1 2010-02-10 <- inserted
1     1    1 2010-02-11 <- inserted
2     1    1 2010-02-12
etc

你想要其他列是什么? - Hugh
@Hugh 其他列应该是第一周的日期的副本(2010-02-5)。 - Timothée HENRY
4个回答

4

可能有些过度,但重点是在与“正确”日期进行连接后填充:

library(dplyr)
library(zoo)

train <- data.frame(D = 1:3, S = 4:6, Date = as.Date("2010-02-05") + 7*(1:3))
full.dates <- as.Date(min(train$Date):max(train$Date), origin = "1970-01-01")
db <- data.frame(Date = full.dates)
fixed <- left_join(db, train)

# Fill from top using zoo::na.locf
fixed[ ,c("D", "S")] <- na.locf(fixed[ ,c("D", "S")])

1
另一种使用zoo包中的na.locf的方法是创建一个zoo时间序列,并在na.locf中使用xout参数。 xout指定要用于额外/插值的日期范围。
library(zoo)

# either convert raw data to zoo object
z <- read.zoo(text = "S    D       Date
1     1    1 2010-02-05
2     1    1 2010-02-12
3     1    1 2010-02-19", index.column = "Date")

# ...or convert your data frame to zoo
z <- zoo(x = df[ , c("S", "D")], order.by = df$Date)

# create a sequence of dates, from first to last date in original data
tt <- seq(from = min(index(z)), to = max(index(z)), by = "day")

# expand time series to 'tt', and replace each NA with the most recent non-NA prior to it
na.locf(z, xout = tt)

#            S D
# 2010-02-05 1 1
# 2010-02-06 1 1
# 2010-02-07 1 1
# 2010-02-08 1 1
# 2010-02-09 1 1
# 2010-02-10 1 1
# 2010-02-11 1 1
# 2010-02-12 1 1
# 2010-02-13 1 1
# 2010-02-14 1 1
# 2010-02-15 1 1
# 2010-02-16 1 1
# 2010-02-17 1 1
# 2010-02-18 1 1
# 2010-02-19 1 1

1
作为一个傻瓜:-),
library(lubridate)
train
#  D S       date
# 1 1 2 2010-02-05
# 2 1 3 2010-02-12
 ttmp<-train[1,]
 for(j in 1:6) ttmp<-rbind(ttmp,train[1,])
 for(j in 2:7) ttmp[j,3]<-ttmp[j-1,3]+ddays(1)
 ttmp
#  D S       date
# 1 1 2 2010-02-05
# 2 1 2 2010-02-06
# 3 1 2 2010-02-07
# 4 1 2 2010-02-08
# 5 1 2 2010-02-09
# 6 1 2 2010-02-10
# 7 1 2 2010-02-11

newtrain<-rbind(train[1,],ttmp)

然后循环遍历你的所有初始行,并使用rbind将它们全部合并在一起。

1
您可以通过以下方式获取缺失行的数量:

nMiss <- diff(as.Date(train$Date))

您可以将数据框的每一行重复相应次数:
longTrain <- train[rep(1:nrow(train), times=c(nMiss, 1)),]

你可以生成一个类似于日期偏移量的内容:
off <- unlist(lapply(c(nMiss,1)-1, seq, from=0)
longTrain$Date <- as.Date(longTrain$Date)+off

如果你想在数据框的末尾添加额外的行,你可以将 c(nMiss,1) 中的常数1更改为相应的数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接