嗨,我正在将我的当前数据集转换为时间序列,方法是将其划分为几周并计算每星期的计数。例如,当前计数为零的周在数据集中被省略。以下是示例数据集。我也想将所有零周都包括在内。如何使用dplyr进行转换。
2013-10-6 1
2014-08-03 1
2014-10-12 1
答案 0 :(得分:1)
1)dplyr 假设输入DF
在末尾的注释中可重复显示,将DF
连接到几周的数据帧,然后将NA值替换为零。在value
末尾的Note中的数据帧中,它是整数,但如果在您的应用程序中为double,则使用0代替0L。
library(dplyr)
DF %>%
right_join(data.frame(date = seq(first(.$date), last(.$date), 7))) %>%
mutate(value = coalesce(value, 0L))
2)动物园由于这是一个时间序列,因此可以使用时间序列表示简化许多计算。转换为动物园对象z
时,我们可以使用这种单线转换,将动物园转换为ts并转换为ts,然后转换为插入NA值。由于ts类不能直接表示日期,因此我们使用聚合将其转换回Date,然后使用na.fill将NA替换为0。
library(zoo)
z <- read.zoo(DF, frequency = 7)
na.fill(aggregate(as.zoo(as.ts(z)), as.Date, c), 0)
这也可以写成:
library(magrittr)
z %>% as.ts %>% as.zoo %>% aggregate(as.Date, c) %>% na.fill(0)
Lines <- "2013-10-6 1
2014-08-03 1
2014-10-12 1"
DF <- read.table(text = Lines, col.names = c("date", "value"))
DF$date <- as.Date(DF$date)
答案 1 :(得分:1)
我们可以使用complete
包中的full_seq
和tidyr
。
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)