【问题标题】:Fastest way for filling-in missing dates for data.table填写data.table缺失日期的最快方法
【发布时间】:2014-04-09 08:25:16
【问题描述】:

我正在从包含日期、订单、金额等字段的 CSV 文件中加载 data.table

输入文件有时没有所有日期的数据。例如如下图:

> NADayWiseOrders
           date orders  amount guests
  1: 2013-01-01     50 2272.55    149
  2: 2013-01-02      3   64.04      4
  3: 2013-01-04      1   18.81      0
  4: 2013-01-05      2   77.62      0
  5: 2013-01-07      2   35.82      2

在上面的 03-Jan 和 06-Jan 中没有任何条目。

希望用默认值填充缺失的条目(例如,订单、金额等为零),或者将最后一个值向前推进(例如,03-Jan 将重用 02-Jan 的值,而 06-Jan 将重用1 月 5 日值等。)

用这样的默认值填补缺失日期数据的空白的最佳/最佳方法是什么?

答案here 建议使用allow.cartesian = TRUEexpand.grid 用于缺少工作日 - 它可能适用于工作日(因为它们只有 7 个工作日) - 但不确定这是否是约会的正确方式同样,尤其是在我们处理多年数据时。

【问题讨论】:

    标签: r datetime data.table


    【解决方案1】:

    惯用的data.table 方式(使用滚动连接)是这样的:

    setkey(NADayWiseOrders, date)
    all_dates <- seq(from = as.Date("2013-01-01"), 
                       to = as.Date("2013-01-07"), 
                       by = "days")
    
    NADayWiseOrders[J(all_dates), roll=Inf]
             date orders  amount guests
    1: 2013-01-01     50 2272.55    149
    2: 2013-01-02      3   64.04      4
    3: 2013-01-03      3   64.04      4
    4: 2013-01-04      1   18.81      0
    5: 2013-01-05      2   77.62      0
    6: 2013-01-06      2   77.62      0
    7: 2013-01-07      2   35.82      2
    

    【讨论】:

    • 谢谢。有用。如果我们想使用默认值(比如 0)而不是滚动以前的值,如何做到这一点?
    • 是的,请问如何自动设置为零?谢谢
    • @maryam 使用roll=0,然后使用NADayWiseOrders[is.na(orders), orders:=0]
    • 有什么方法可以在群组中做到这一点? IE。到seq 从组内的最小日期到最大日期,并在组内进行滚动加入?
    • 在组内填补空白作为另一个答案发布
    【解决方案2】:

    不确定是否是最快的,但如果数据中没有NAs,它会起作用:

    # just in case these aren't Dates. 
    NADayWiseOrders$date <- as.Date(NADayWiseOrders$date)
    # all desired dates.
    alldates <- data.table(date=seq.Date(min(NADayWiseOrders$date), max(NADayWiseOrders$date), by="day"))
    # merge
    dt <- merge(NADayWiseOrders, alldates, by="date", all=TRUE)
    # now carry forward last observation (alternatively, set NA's to 0)
    require(xts)
    na.locf(dt)
    

    【讨论】:

    • 谢谢。对于NA替换为0,我想知道除了在每个字段上进行常规dt$orders[is.na(dt$orders)] &lt;- 0替换之外,是否有更快的方法(可能使用data.table的特殊语法)。
    【解决方案3】:

    这是您填补子组内空白的方法

    # a toy dataset with gaps in the time series
    dt <- as.data.table(read.csv(textConnection('"group","date","x"
    "a","2017-01-01",1
    "a","2017-02-01",2
    "a","2017-05-01",3
    "b","2017-02-01",4
    "b","2017-04-01",5')))
    dt[,date := as.Date(date)]
    
    # the desired dates by group
    indx <- dt[,.(date=seq(min(date),max(date),"months")),group]
    
    # key the tables and join them using a rolling join
    setkey(dt,group,date)
    setkey(indx,group,date)
    dt[indx,roll=TRUE]
    
    #>    group       date x
    #> 1:     a 2017-01-01 1
    #> 2:     a 2017-02-01 2
    #> 3:     a 2017-03-01 2
    #> 4:     a 2017-04-01 2
    #> 5:     a 2017-05-01 3
    #> 6:     b 2017-02-01 4
    #> 7:     b 2017-03-01 4
    #> 8:     b 2017-04-01 5
    

    【讨论】:

    • 真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2018-10-05
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多