【发布时间】:2018-04-26 02:59:18
【问题描述】:
背景
我有一个季度数据集,其中缺少某些季度和相应的值。数据集的特点是:
- 每个组应该有相同数量的季度,但实际上缺少季度
- 对于缺失的季度值未知
- 这将通过采购估算下一个可用值来解决;例如,可通过
na.locf函数获得
- 这将通过采购估算下一个可用值来解决;例如,可通过
示例数据
# Packages
Vectorize(require)(package = c("tidyverse", "zoo", "magrittr"),
character.only = TRUE)
# Seed
set.seed(123)
# Dummy data
dta <- data.frame(group = rep(LETTERS[1:5], 10)) %>%
group_by(group) %>%
mutate(qrtr = seq(
from = as.Date("01/01/2012", "%d/%m/%Y"),
to = as.Date("31/5/2014", "%d/%m/%Y"),
by = "quarter"
)) %>%
ungroup() %>%
mutate(qrtr = as.yearqtr(qrtr)) %>%
arrange(group, qrtr) %>%
mutate(value = sample(1:10, 50, replace = TRUE))
# Remove random rows
dta[sample(1:dim(dta)[1], 10), c(2, 3)] <- NA
dta %<>% na.omit()
预览
# A tibble: 40 x 3
group qrtr value
<chr> <S3: yearqtr> <int>
1 A 2012 Q1 3
2 A 2012 Q2 8
3 A 2012 Q4 9
4 A 2013 Q1 10
5 A 2013 Q3 6
6 A 2013 Q4 9
7 A 2014 Q1 6
8 B 2012 Q1 10
9 B 2012 Q2 5
10 B 2012 Q3 7
# ... with 30 more rows
问题
-
在缺少季度的每个组内创建添加行。季度总数来自序列
min(qrtr)到max(qrtr),在现有代码的上下文中:seq(from = as.Date("01/01/2012", "%d/%m/%Y"), to = as.Date("31/5/2014", "%d/%m/%Y"), by = "quarter") 第一个非缺失值应为缺失值结转。
想要的结果:
>> dta
# A tibble: 50 x 3
group qrtr value
<chr> <S3: yearqtr> <int>
1 A 2012 Q1 3
2 A 2012 Q2 8
3 A 2012 Q3 8
4 A 2012 Q4 9
5 A 2013 Q1 10
6 A 2013 Q2 10
7 A 2013 Q3 6
8 A 2013 Q4 9
9 A 2014 Q1 6
10 A 2015 Q1 6
# ... with 40 more rows
建议的方法
一种方法是使用expand,以便将隐式缺失值转换为显式缺失值。到目前为止,这会导致缺少季度,但没有明确的方法可以为缺少给定季度的value 列创建缺失的观察结果。
dta %>%
# Append mixing quarters
expand(group, qrtr) %>%
left_join(data.frame(qrtr = as.yearqtr(
seq(
from = as.Date("01/01/2012", "%d/%m/%Y"),
to = as.Date("31/5/2014", "%d/%m/%Y"),
by = "quarter"
)
)), by = "qrtr") %>%
# TODO
# mutate(value = na.locf(value)) %>%
arrange(group, qrtr) -> dta_fixed
【问题讨论】:
标签: r dplyr time-series zoo