R 考虑时间序列数据中的零
您好,我正在将当前数据集转换为时间序列,方法是将其划分为周,并每周计数。例如,当前计数为零的周数在数据集中被忽略。下面是示例数据集。我想包括计数为零的所有周。如何使用dplyr对其进行转换 2013-10-6 1R 考虑时间序列数据中的零,r,dplyr,time-series,R,Dplyr,Time Series,您好,我正在将当前数据集转换为时间序列,方法是将其划分为周,并每周计数。例如,当前计数为零的周数在数据集中被忽略。下面是示例数据集。我想包括计数为零的所有周。如何使用dplyr对其进行转换 2013-10-6 1 2014-08-03 1 2014年10月12日11)dplyr假设输入是右端注释中重复显示的DF,将DF连接到数周的数据框中,然后将NA值替换为零。在注释末尾的数据框中,值为整数,但如果在应用程序中为双精度,则使用0代替0L library(dplyr) DF %>%
2014-08-03 1
2014年10月12日11)dplyr假设输入是右端注释中重复显示的DF,将DF连接到数周的数据框中,然后将NA值替换为零。在注释末尾的数据框中,
值
为整数,但如果在应用程序中为双精度,则使用0代替0L
library(dplyr)
DF %>%
right_join(data.frame(date = seq(first(.$date), last(.$date), 7))) %>%
mutate(value = coalesce(value, 0L))
2)zoo由于这是一个时间序列,许多计算可以通过使用时间序列表示法来简化。转换为zoo对象z
我们可以使用这个从zoo到ts再到ts的线性转换,它具有插入NA值的效果。由于ts类不能直接表示日期,我们使用聚合将其转换回日期,然后使用na.fill将NAs替换为0
library(zoo)
z <- read.zoo(DF, frequency = 7)
na.fill(aggregate(as.zoo(as.ts(z)), as.Date, c), 0)
注
行我们可以使用tidyr
包中的complete
和full\ seq
library(dplyr)
library(tidyr)
dat2 <- dat %>%
mutate(V1 = as.Date(V1)) %>%
complete(V1 = full_seq(V1, period = 7), fill = list(V2 = 0))
dat2
# # A tibble: 54 x 2
# V1 V2
# <date> <dbl>
# 1 2013-10-06 1
# 2 2013-10-13 0
# 3 2013-10-20 0
# 4 2013-10-27 0
# 5 2013-11-03 0
# 6 2013-11-10 0
# 7 2013-11-17 0
# 8 2013-11-24 0
# 9 2013-12-01 0
# 10 2013-12-08 0
# # ... with 44 more rows
库(dplyr)
图书馆(tidyr)
dat2%
变异(V1=截止日期(V1))%>%
完成(V1=完整顺序(V1,周期=7),填充=列表(V2=0))
dat2
##A tibble:54 x 2
#V1 V2
#
# 1 2013-10-06 1
# 2 2013-10-13 0
# 3 2013-10-20 0
# 4 2013-10-27 0
# 5 2013-11-03 0
# 6 2013-11-10 0
# 7 2013-11-17 0
# 8 2013-11-24 0
# 9 2013-12-01 0
# 10 2013-12-08 0
# # ... 还有44行
数据
dat <- read.table(text = "'2013-10-6' 1
'2014-08-03' 1
'2014-10-12' 1",
header = FALSE, stringsAsFactors = FALSE)
dat一个选项是创建一个您希望包含的日期列表,并将其连接回摘要数据框。在@cardinal40 comment之后,您可以生成一个最小日期和最大日期之间的所有日期序列,并对其进行外部连接。如果您想要更具体的答案,您需要提供示例数据和所需输出。感谢您的解释:)
library(dplyr)
library(tidyr)
dat2 <- dat %>%
mutate(V1 = as.Date(V1)) %>%
complete(V1 = full_seq(V1, period = 7), fill = list(V2 = 0))
dat2
# # A tibble: 54 x 2
# V1 V2
# <date> <dbl>
# 1 2013-10-06 1
# 2 2013-10-13 0
# 3 2013-10-20 0
# 4 2013-10-27 0
# 5 2013-11-03 0
# 6 2013-11-10 0
# 7 2013-11-17 0
# 8 2013-11-24 0
# 9 2013-12-01 0
# 10 2013-12-08 0
# # ... with 44 more rows
dat <- read.table(text = "'2013-10-6' 1
'2014-08-03' 1
'2014-10-12' 1",
header = FALSE, stringsAsFactors = FALSE)