R 按组插入缺失的连续周

R 按组插入缺失的连续周,r,dplyr,R,Dplyr,我有一个包含每周数据的数据集。本周从周一开始,到周日结束。该数据集也按组划分 我想检测每个组的开始和结束之间是否缺少任何连续日期。以下是一个示例数据集: Week<- as.Date(c('2015-04-13', '2015-04-20', '2015-05-04', '2015-06-29', '2015-07-27', '2015-08-03')) Group <- c('A', 'A', 'A','B','B','B','B') Value<- c(2,3,10,4,1

我有一个包含每周数据的数据集。本周从周一开始,到周日结束。该数据集也按组划分

我想检测每个组的开始和结束之间是否缺少任何连续日期。以下是一个示例数据集:

Week<- as.Date(c('2015-04-13', '2015-04-20', '2015-05-04', '2015-06-29', '2015-07-27', '2015-08-03'))
Group <- c('A', 'A', 'A','B','B','B','B')
Value<- c(2,3,10,4,11,9,8)

df<-data.frame(Week, Group, Value)

df
      Week    Group     Value
2015-04-13        A         2
2015-04-20        A         3
2015-05-04        A        10
2015-06-29        B         4
2015-07-06        B        11
2015-07-27        B         9
2015-08-03        B         8

任何帮助都会很好,谢谢

我发现实现这一点的唯一方法是在SQL中使用不等式连接

library(tidyverse)
library(sqldf)

Week<- as.Date(c('2015-04-13', '2015-04-20', '2015-04-27', '2015-05-04', 
'2015-06-29', '2015-06-07', '2015-07-27', '2015-08-03'))
Group <- c('A', 'A','A', 'A','B','B','B','B')
Value<- c(2,3,2,10,4,11,9,8)

df<-data.frame(Week, Group, Value)

#what are the start and end weeks for each group?
GroupWeeks <- df %>% 
  group_by(Group) %>% 
  summarise(start = min(Week),
            end = max(Week)) 

#What are all the possible weeks?
AllWeeks <- data.frame(Week = seq.Date(min(df$Week), max(df$Week), by = "week"))


#use an inequality join to add rows for every week within the group's range
sqldf("Select AllWeeks.Week, GroupWeeks.[Group], Value
      From AllWeeks inner join GroupWeeks on AllWeeks.Week >= start AND AllWeeks.Week <= end
      left join df on AllWeeks.Week = df.Week and GroupWeeks.[Group] = df.[Group]")
库(tidyverse)
库(sqldf)

Week我发现实现这一点的唯一方法是在SQL中使用不等式连接

library(tidyverse)
library(sqldf)

Week<- as.Date(c('2015-04-13', '2015-04-20', '2015-04-27', '2015-05-04', 
'2015-06-29', '2015-06-07', '2015-07-27', '2015-08-03'))
Group <- c('A', 'A','A', 'A','B','B','B','B')
Value<- c(2,3,2,10,4,11,9,8)

df<-data.frame(Week, Group, Value)

#what are the start and end weeks for each group?
GroupWeeks <- df %>% 
  group_by(Group) %>% 
  summarise(start = min(Week),
            end = max(Week)) 

#What are all the possible weeks?
AllWeeks <- data.frame(Week = seq.Date(min(df$Week), max(df$Week), by = "week"))


#use an inequality join to add rows for every week within the group's range
sqldf("Select AllWeeks.Week, GroupWeeks.[Group], Value
      From AllWeeks inner join GroupWeeks on AllWeeks.Week >= start AND AllWeeks.Week <= end
      left join df on AllWeeks.Week = df.Week and GroupWeeks.[Group] = df.[Group]")
库(tidyverse)
库(sqldf)

周您可以使用
完成
tidyr
包,即

library(tidyverse)

df %>% 
 group_by(Group) %>% 
 complete(Week = seq(min(Week), max(Week), by = 'week'))
这就给了,

#一个tible:10 x 3
#分组:分组[2]
团体周价值
1 A 2015-04-13 2
2 A 2015-04-20 3
3 A 2015-04-27 NA
4a 2015-05-0410
5b 2015-06-29 4
6b 2015-07-06北美
7b 2015-07-13北美
8b 2015-07-20北美
9 B 2015-07-27 11
10 B 2015-08-03 9

您可以使用
tidyr
软件包中的
complete
,即

library(tidyverse)

df %>% 
 group_by(Group) %>% 
 complete(Week = seq(min(Week), max(Week), by = 'week'))
这就给了,

#一个tible:10 x 3
#分组:分组[2]
团体周价值
1 A 2015-04-13 2
2 A 2015-04-20 3
3 A 2015-04-27 NA
4a 2015-05-0410
5b 2015-06-29 4
6b 2015-07-06北美
7b 2015-07-13北美
8b 2015-07-20北美
9 B 2015-07-27 11
10 B 2015-08-03 9

这可以使用
seq
功能实现。下面是代码片段

代码:

Week<- as.Date(c('2015-04-13', '2015-04-20', '2015-04-27', '2015-05-04', '2015-06-29','2015-07-06', '2015-07-27', '2015-08-03'))
Group <- c('A', 'A','A', 'A','B','B','B','B')
Value<- c(2,3,2,10,4,11,9,8)

df<-data.frame(Week, Group, Value)

#generate all the missing dates
alldates = seq(min(df$Week[df$Group == 'B']), max(df$Week[df$Group == 'B']), 7)

#filter out the dates that are not present in your dataset
dates = alldates[!(alldates %in% df$Week)]

#add these new dates to a new dataframe and rbind with the old dataframe 
new_df = data.frame(Week = dates,Group = 'B', Value = NA)
df = rbind(df, new_df)
df = df[order(df$Week),]
         Week Group Value
1  2015-04-13     A     2
2  2015-04-20     A     3
3  2015-04-27     A     2
4  2015-05-04     A    10
5  2015-06-29     B     4
6  2015-07-06     B    11
9  2015-07-13     B    NA
10 2015-07-20     B    NA
7  2015-07-27     B     9
8  2015-08-03     B     8

这可以使用
seq
功能实现。下面是代码片段

代码:

Week<- as.Date(c('2015-04-13', '2015-04-20', '2015-04-27', '2015-05-04', '2015-06-29','2015-07-06', '2015-07-27', '2015-08-03'))
Group <- c('A', 'A','A', 'A','B','B','B','B')
Value<- c(2,3,2,10,4,11,9,8)

df<-data.frame(Week, Group, Value)

#generate all the missing dates
alldates = seq(min(df$Week[df$Group == 'B']), max(df$Week[df$Group == 'B']), 7)

#filter out the dates that are not present in your dataset
dates = alldates[!(alldates %in% df$Week)]

#add these new dates to a new dataframe and rbind with the old dataframe 
new_df = data.frame(Week = dates,Group = 'B', Value = NA)
df = rbind(df, new_df)
df = df[order(df$Week),]
         Week Group Value
1  2015-04-13     A     2
2  2015-04-20     A     3
3  2015-04-27     A     2
4  2015-05-04     A    10
5  2015-06-29     B     4
6  2015-07-06     B    11
9  2015-07-13     B    NA
10 2015-07-20     B    NA
7  2015-07-27     B     9
8  2015-08-03     B     8

我提供了一个可复制的数据集。你可以分享你的工作,这样我们就可以从我们这边复制。我提供了一个可复制的数据集。在我的案例中,这个数据集是有效的。不过,在
by=week
部分,我假设的默认值是星期一和星期日。有没有一种方法可以事先调整,以防我的周数发生变化,以备将来使用?例如,假设我的一周从星期日到星期一?@nak5120该周将从min日期开始。所以无论你第一天做什么,这一周都会从那里开始,7天后结束。太好了,这很有意义。这对我来说是可行的。不过,在
by=week
部分,我假设的默认值是星期一和星期日。有没有一种方法可以事先调整,以防我的周数发生变化,以备将来使用?例如,假设我的一周从星期日到星期一?@nak5120该周将从min日期开始。所以无论你第一天做什么,这一周都会从那里开始,7天后结束。很好,这很有意义