我有一个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
答案 0 :(得分:0)
如果我理解正确,OP希望更新my.list
中的每个数据框,以便在日期full
在基数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