R如何统计在职员工累计工作时间

kr98yfug  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(122)

我有一个包含以下示例数据的简单表。雇员9的最后一个单元格故意为空,以表示雇员9仍在工作。
| 员工ID|组群|开始日期(_D)|结束日期|
| - -|- -|- -|- -|
| 一个|系统|2020年1月12日|2021年2月14日|
| 2个|比奥弗克斯|2021年3月3日|2022年9月7日|
| 三个|系统|2021年4月3日|2022年6月6日|
| 四个|比奥弗克斯|2021年5月1日|2022年6月7日|
| 五个|系统|2021年10月1日|2022年6月7日|
| 六个|比奥弗克斯|2021年12月1日|2022年9月1日|
| 七个|系统|2022年1月1日|2022年10月1日|
| 八个|比奥弗克斯|2022年2月1日|2022年11月1日|
| 九个|系统|2022年6月1日||
我想要计算和绘制的是,在某个范围内的每一天,目前工作的员工累计工作了多少个工作日。如果我能做到这一点,我计划显示一个按组着色的区域图,或类似的东西。希望此分析将突出显示最资深员工离开公司的日期。
到目前为止,我已经导入并润滑了我的table:

#loads the table above with NA in the empty cell
DATES = read_excel(fname)

#example date range. Will likely use the minimum start date eventually
date_range = as_date(mdy("1-1-20"):mdy("1-1-23"))

#reformat the date columns and create an interval
DATES = DATES %>%
  mutate(start_date_ymd = ymd(start_date)) %>%
  mutate(end_date_ymd = ymd(end_date)) %>%
  select(-start_date, -end_date) %>%
  mutate(work_interval = interval(start_date_ymd, end_date_ymd)) 

# naive start - can I just plot the number of workers working on each day?
num_workers<- sapply(date_range, function(x) sum(x %within% DATES$work_interval))
tibble(date_range, num_workers) %>%
  ggplot(aes(x=date_range, y=num_workers)) +
    geom_point()

虽然上面的最后几行不是我想要的-为什么我看不到worker 8工作到11月的数据?

但是,即使我弄明白了为什么我的图是错误的,我真的需要一些指导,如何计算每天工作的所有员工的工作日总和。

p3rjfoxz

p3rjfoxz1#

您可以展开开始和结束之间所有日期的列表。然后按日期进行汇总。

# Basic dataset.  Fill in missing end date.
df <- read_table("employee_ID   group   start_date  end_date
1   systems 12-Jan-20   14-Feb-21
2   biofx   03-Mar-21   07-Sep-22
3   systems 03-Apr-21   06-Jun-22
4   biofx   01-May-21   07-Jun-22
5   systems 01-Oct-21   07-Jun-22
6   biofx   01-Dec-21   01-Sep-22
7   systems 01-Jan-22   01-Oct-22
8   biofx   01-Feb-22   01-Nov-22
9   systems 01-Jun-22   ") %>% 
    mutate(across(ends_with("date"), lubridate::dmy)) %>% 
    replace_na(list(end_date =lubridate::today()))

# Expand by date:
df2 <- df %>% 
    mutate(days = map2(start_date, end_date, ~seq(1L, as.integer(.y - .x), by = 1L))) %>% 
    unnest(days) %>% 
    mutate(date = start_date + lubridate::days(days)) %>% 
    select(-start_date, -end_date)

# Summarize by date:
df3 <- df2 %>% 
    group_by(date, group) %>% 
    summarize(num_workers = n(),
              total_experience = sum(days))

# Plot cumulative days worked
df3 %>% 
    ggplot(aes(date, total_experience, fill = group)) +
    geom_col()

你可以清楚地看到人们离开的日子,以及他们带去了多少经验。

相关问题