如何使用R中的开始和结束日期创建每周总计

时间:2018-04-09 23:03:15

标签: r date count dplyr

我有一个包含来自工人的3年数据的数据框:变量d_start和d_end分别表示工人开始工作和完成的日期。

我需要从第1年开始每周获得活跃工人的数量。在第1年之前,工人可以参加项目。

我开始创建一个矢量V =(1:52),其中包含一年中的周数和每行,使用

构建具有相应周的矢量
seq("d_start", "d_end", by= "week")

然后与相应周内的向量V和求和进行比较,但它没有用。

这就是我所拥有的(真实数据)

d_start     d_end
2015/01/17  2018/03/22
2016/03/01  2016/10/02 
2017/01/17  2018/03/19
2017/01/17  2018/03/25
2016/02/01  2016/04/30
.           .
.           .
.           .

这就是我需要的,(这是一个例子)

year  week   count
2016  1       20
2016  2       28
.     .       . 
.     .       . 
.     .       . 
2016  52      25
2017  1       22
2017  3       14
2017  4        8
.     .       . 
.     .       . 
.     .       . 
2017 52       14
2018  1       25

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

df只是您的数据框架。 mutate使用year中的weeklubridate函数来提取年份和周数。其余的很简单。

library(lubridate)
library(dplyr)
df = df %>% mutate(year = year(d_start), week = week(d_start)) %>% 
  group_by(year, week) %>% summarise(count = n())
编辑:错误解释的问题。这是一个(杂乱的)解决方案。

df = data.frame(d_start = as.Date(c('2015/01/17','2016/03/01','2017/01/17','2017/01/17','2016/02/01')),
                d_end = as.Date(c('2018/03/22','2016/10/02','2018/03/19','2018/03/25','2016/04/30')))
df2 = data.frame(Date = seq(min(df$d_start), max(df$d_end), by = 'week')) %>% 
  mutate(year = year(Date), week = week(Date), count = 0) %>% select(-Date)
for (i in 1:dim(df)[1]) {
  x = df[i,]
  interval = seq(x$d_start, x$d_end, by = 'week')
  interval = paste(year(interval), week(interval), sep = '-')
  df2[paste(df2$year, df2$week, sep = '-') %in% interval,]$count = df2[paste(df2$year, df2$week, sep = '-') %in% interval,]$count + 1
}

首先,我使用年和周初始化结果数据框df2,并将计数设置为0.然后我循环df,计算年份和周工人i是活动,并为匹配的年份和周数增加df2$count