【问题标题】:How to create weekly totals using start and end dates in R如何使用 R 中的开始日期和结束日期创建每周总计
【发布时间】:2018-04-09 23:03:14
【问题描述】:

我有一个包含工人 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

有什么想法吗?谢谢!

【问题讨论】:

    标签: r date count dplyr


    【解决方案1】:

    df 只是您的数据框。 mutate 使用 lubridate 中的 yearweek 函数来提取年和周。然后剩下的就很简单了。

    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 处于活动状态的年份和周数,并增加@987654331 @ 表示匹配的年份和周数。

    【讨论】:

    • Spinodal:我真的很感谢你! 但是让我用一个例子问你一个关于代码的问题。假设我有两个工人:两个从一月的第一周开始,但只有一个工作到十二月的最后一周。因此,最终结果将是每周计数 2 到年中,然后每周计数 1。这段代码能做到吗?我希望有一个长度为 52 的向量,前半部分等于 2,后半部分等于 1。
      您的代码只生成了一行。
    • 我认为您的代码计算了同一周开始的行数(工人)。但我需要知道“在给定的一周内有多少工人是活跃的”。这就是为什么我为每个工人都有 d_start 和 d_end。就像我说的。例如,对于第 1 年,我将有一个长度为 52 的向量,其中包含每周的活跃工人数量。
    • 对不起,误解了你。我为您的问题编辑了一个凌乱的解决方案
    • +1 太好了!这就是我要找的!就是棒!非常感谢 spinodal !现在我可以用它来开发我的模型了!
    • 很高兴它成功了!对不起,我第一次没有得到它^.^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2019-08-24
    相关资源
    最近更新 更多