使用任意数量的列的NAs值自动扩展数据框以查找缺少的日期

时间:2016-08-06 09:19:06

标签: r date datetime dataframe

我有兴趣在数据单元之后的数据缺失期间,在任意数量的列中展开具有缺失值的数据框。

实施例

使用一个简单的例子可以很容易地说明问题。

数据

生成的数据包含随机丢失的一些时间序列观察和日期。

# Data generation

# Seed
set.seed(1)

# Size
sizeDf <- 10

# Populate data frame
dta <- data.frame(
    dates = seq(
        from = Sys.Date() - (sizeDf - 1),
        to = Sys.Date(),
        by = 1
    ),
    varA = runif(n = sizeDf),
    varB = runif(n = sizeDf),
    varC = runif(n = sizeDf)
)

# Delete rows
dta <-
    dta[-sample(1:sizeDf, replace = TRUE, size = round(sqrt(sizeDf), 0)),]

预览

>> dta
        dates       varA      varB       varC
1  2016-07-28 0.26550866 0.2059746 0.93470523
2  2016-07-29 0.37212390 0.1765568 0.21214252
3  2016-07-30 0.57285336 0.6870228 0.65167377
4  2016-07-31 0.90820779 0.3841037 0.12555510
7  2016-08-03 0.94467527 0.7176185 0.01339033
8  2016-08-04 0.66079779 0.9919061 0.38238796
9  2016-08-05 0.62911404 0.3800352 0.86969085
10 2016-08-06 0.06178627 0.7774452 0.34034900

主要特征

从提出的分析的角度来看,关键特征是:

  • 日期单位,在这种情况下的天数
  • 随机错过日期

缺少日期

seq(
    from = Sys.Date() - (sizeDf - 1),
    to = Sys.Date(),
    by = 1
)[!(seq(
    from = Sys.Date() - (sizeDf - 1),
    to = Sys.Date(),
    by = 1
) %in% dta$dates)]

"2016-08-01" "2016-08-02"

期望的结果

新创建的数据框应如下所示:

>> dtaNew
        dates      varA       varB      varC
1  2016-07-28 0.3337749 0.32535215 0.8762692
2  2016-07-29 0.4763512 0.75708715 0.7789147
3  2016-07-30 0.8921983 0.20269226 0.7973088
4  2016-07-31 0.8643395 0.71112122 0.4552745
5  2016-08-01        NA         NA        NA
6  2016-08-02        NA         NA        NA
7  2016-08-03 0.9606180 0.14330438 0.6049333
8  2016-08-04 0.4346595 0.23962942 0.6547239
9  2016-08-05 0.7125147 0.05893438 0.3531973
10 2016-08-06 0.3999944 0.64228826 0.2702601

这只是通过使用:

获得的
dtaNew[dtaNew$dates %in% missDates, 2:4] <- NA

其中missDates取自之前的seq

的尝试

创建包含所有日期的向量很简单:

allDates <- seq(from = min(dta$dates), to = max(dta$dates), by = 1)

但显然我不能把它推到数据框:

>> dta$allDates  <- allDates
Error in `$<-.data.frame`(`*tmp*`, "allDates", value = c(17010, 17011,  : 
  replacement has 10 rows, data has 8

可能的解决方案可以使用循环,将每行标记为缺失的行NA值逐行推送到数据框,但这非常低效且杂乱。

总而言之,我有兴趣实现以下目标:

  1. 使用相同单位后的所有日期展开数据框。即添加了缺失的每日数据天数,因为缺少季度数据季度。
  2. 然后我想在数据框中的所有列中推送NA值,以找出缺失日期的位置

1 个答案:

答案 0 :(得分:0)

如果我理解了您的问题,您可以使用rbind.fill包中的plyr来获得所需的输出:

sizeDf <- 10
# Populate data frame
dta <- data.frame(
  dates = seq(
    from = Sys.Date() - (sizeDf - 1),
    to = Sys.Date(),
    by = 1
  ),
  varA = runif(n = sizeDf),
  varB = runif(n = sizeDf),
  varC = runif(n = sizeDf)
)

# Delete rows
dta <-dta[-sample(1:sizeDf, replace = TRUE, size = round(sqrt(sizeDf), 0)),]

#Get missing dates
missing_dates <- seq(from=min(dta$dates), to=max(dta$dates), by=1)[!(seq(from=min(dta$dates), to=max(dta$dates), by=1) %in% dta$dates)]

#Create the new dataset by using plyr's rbind.fill function
dta_new <- plyr::rbind.fill(dta,data.frame(dates=missing_dates))

#Order the data by the dates column
dta_new <- dta_new[order(dta_new$dates),]

#Print it
print(dta_new, row.names = F, right = F)


 dates      varA        varB      varC      
 2016-07-28 0.837859418 0.2966637 0.61245244
 2016-07-29 0.144884547 0.9284294 0.11033990
 2016-07-30          NA        NA         NA
 2016-07-31          NA        NA         NA
 2016-08-01 0.003167049 0.9096805 0.29239470
 2016-08-02 0.574859760 0.1466993 0.69541969
 2016-08-03          NA        NA         NA
 2016-08-04 0.748639215 0.9602836 0.67681826
 2016-08-05 0.983939562 0.4867804 0.35270309
 2016-08-06 0.383366957 0.2241982 0.09244522

我希望这会有所帮助。