我有一个包含来自工人的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
有什么想法吗?谢谢!
答案 0 :(得分:1)
df
只是您的数据框架。 mutate
使用year
中的week
和lubridate
函数来提取年份和周数。其余的很简单。
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
。