匹配R中数据框列表的日期

时间:2018-05-29 01:36:45

标签: r date time-series match

我有一个100多个时间序列数据帧my.list的列表,每个产品在其自己的数据框中有每日观察值。有些值是NA,没有任何日期记录。我想更新此列表中的每个数据框以显示日期,如果它在此日期没有记录,则显示NA

日期:

start = as.Date('2016/04/08')
full <- seq(start, by='1 days', length=10)

时间序列数据示例:

d1 <- data.frame(Date = seq(start, by ='2 days',length=5), Sales = c(5,10,15,20,25))
d2 <- data.frame(Date = seq(start, by= '1 day', length=10),Sales = c(1, 2, 3,4,5,6,7,8,9,10))
my.list <- list(d1, d2)

我想将所有full日期值合并到每个数据框中,如果不存在匹配,则sales为NA:

   my.list

[[d1]]
Date    Sales
2016-04-08    5
2016-04-09    NA
2016-04-10    10
2016-04-11    NA
2016-04-12    15
2016-04-13    NA
2016-04-14    20
2016-04-15    NA
2016-04-16    25
2016-04-17    NA


[[d2]]
Date    Sales
2016-04-08    1
2016-04-09    2
2016-04-10    3
2016-04-11    4
2016-04-12    5
2016-04-13    6
2016-04-14    7
2016-04-15    8
2016-04-16    9
2016-04-17    10

1 个答案:

答案 0 :(得分:0)

如果我理解正确,OP希望更新my.list中的每个数据框,以便在日期full

向量中给出的每个日期包含一行

基础R

在基数R中,merge()可以使用# creat dataframe from vector of full dates full.df <- data.frame(Date = full) # apply merge on each dataframe in the list lapply(my.list, merge, y = full.df, all.y = TRUE) 已经提到的[[1]] Date Sales 1 2016-04-08 5 2 2016-04-09 NA 3 2016-04-10 10 4 2016-04-11 NA 5 2016-04-12 15 6 2016-04-13 NA 7 2016-04-14 20 8 2016-04-15 NA 9 2016-04-16 25 10 2016-04-17 NA [[2]] Date Sales 1 2016-04-08 1 2 2016-04-09 2 3 2016-04-10 3 4 2016-04-11 4 5 2016-04-12 5 6 2016-04-13 6 7 2016-04-14 7 8 2016-04-15 8 9 2016-04-16 9 10 2016-04-17 10 。但是,下面的答案将其扩展为适用于列表中的所有数据帧:

full
Date

买者

答案假设Date涵盖了列表中所有数据框的my.list的整体范围。

为了避免任何意外,可以从overall_date_range <- Reduce(range, lapply(my.list, function(x) range(x$Date))) full <- seq(overall_date_range[1], overall_date_range[2], by = "1 days") 中的可用数据中检索rbindlist()的整体范围:

rbindlist()

使用data.table

或者,结构相同的数据帧列表可以存储在大型数据帧中。附加属性指示每行属于哪个产品。均匀结构简化了后续操作。

以下代码使用data.table包中的CJ()函数创建大library(data.table) all_products <- rbindlist(my.list, idcol = "product.id")[ CJ(product.id = unique(product.id), Date = seq(min(Date), max(Date), by = "1 day")), on = .(Date, product.id)] all_products product.id Date Sales 1: 1 2016-04-08 5 2: 1 2016-04-09 NA 3: 1 2016-04-10 10 4: 1 2016-04-11 NA 5: 1 2016-04-12 15 6: 1 2016-04-13 NA 7: 1 2016-04-14 20 8: 1 2016-04-15 NA 9: 1 2016-04-16 25 10: 1 2016-04-17 NA 11: 2 2016-04-08 1 12: 2 2016-04-09 2 13: 2 2016-04-10 3 14: 2 2016-04-11 4 15: 2 2016-04-12 5 16: 2 2016-04-13 6 17: 2 2016-04-14 7 18: 2 2016-04-15 8 19: 2 2016-04-16 9 20: 2 2016-04-17 10 交叉加入)会创建日期和产品ID的所有组合,然后合并/加入以填充缺少的日期:

product.id
all_products[!is.na(Sales), .(valid.sales.data = .N), by = product.id]

后续操作可以按 product.id valid.sales.data 1: 1 5 2: 2 10 分组,例如,以确定每种产品的有效销售数据的数量:

all_products[, .(total.sales = sum(Sales, na.rm = TRUE)), by = product.id]
   product.id total.sales
1:          1          75
2:          2          55

或者,每件产品的总销售额:

split(all_products, by = "product.id")
<script type="text/javascript">
    var scrollCount = 0;
    window.onscroll = function () {
        var hash = window.location.hash.substr(1);
        if (hash === "chats") {
            scrollCount++;
        }
        if (scrollCount === 1) {
            window.scrollTo(0, 0);
        }
    }
</script>

如果出于某种原因需要,可以通过

将结果转换回列表
fk | value
========
A  |  1
A  |  2
B  |  1
C  |  1