r-针对缺失日期,在任意列中自动扩展具有NA值的数据帧



我感兴趣的是,在数据单元后面缺少数据的时段,在任意数量的列中扩展一个缺少值的数据帧。

示例

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

数据

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

# 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

其中CCD_ 1取自先前的CCD_。


尝试

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

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值推送到数据框中找到缺失日期的所有列中

如果我理解你的问题,你可以使用plyr包中的rbind.fill来获得你想要的输出:

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

我希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新