在R:如何提取有关有效时间段的信息并将其应用于另一个数据集



我必须要组合的数据集:

数据集1:包含" PERC"有效的时间段:

set.seed(1)
example_df <- data.frame(ID = rep(1:2, each=2),   
start = c(as.Date("2014-01-01"), as.Date("2014-03-05"), as.Date("2014-01-13"), as.Date("2014-03-15")), 
                         end = c(as.Date("2014-03-05"), as.Date("2014-04-12"), as.Date("2014-03-01"), as.Date("2014-04-02")), 
                         perc = rnorm(mean= 30, sd= 10, 4)) 

数据集2:包含每个月的付款:

 month_start <- as.Date("2014-01-01") + months(0:3)
    month_end <-  ceiling_date(month_start, "month") - days(1)
set.seed(1)
example_df2 <-  data.frame(month_start, month_end,
                           ID = rep(1:2, each=4),
                           pay = rnorm(mean= 2000, sd= 80, 8))

目标是根据他们工作的perc计算每个月的每个人的薪水。重要的是要考虑PERC的有效时间,这可能会在一个月内发生变化。

例如:

2014年1月ID 1:PAY = 1949.884(PAY)*23.73546(PERC)/100

因为PERC在整个1月有效。

但是,在3月,PERC为23.73546,直到第5位,而PERC为3月剩余时间的31.83643。

因此,

2014年3月ID 1:PAY = 1949.884(付费)*23.73546(PERC)/100/31(3月的天数)*5 1949.884(付费)*31.83643(PERC)/100/31(3月的天数)*26

从您的两个数据范围之间的left_join()开始。ID的每个工作期间都将在此ID的每个付款月内复制。然后,我们连续ifelse(),您可以确定总月份应该是计数的,只是一个零件。

library(tidyverse)
result <- example_df %>% 
  left_join(example_df2, by = 'ID') %>% 
  mutate(
    TEST_MONTH = ifelse(end >= month_start & start < month_end, 1, 0), 
    TEST_DAYS  = ifelse(TEST_MONTH == 1,
                        ifelse(end > month_end,
                               ifelse(start >= month_start, month_end - start + 1, month_end - month_start + 1), 
                               end - month_start + 1), 
                        0),
    PAID = pay * perc/100 * TEST_DAYS / as.numeric(month_end - month_start + 1)
  )
result %>% filter(ID == 1)
# ID      start        end     perc month_start  month_end      pay TEST_MONTH TEST_DAYS      PAID
# 1  1 2014-01-01 2014-03-05 23.73546  2014-01-01 2014-01-31 1949.884          1        31 462.81390
# 2  1 2014-01-01 2014-03-05 23.73546  2014-02-01 2014-02-28 2014.691          1        28 478.19633
# 3  1 2014-01-01 2014-03-05 23.73546  2014-03-01 2014-03-31 1933.150          1         5  74.00678
# 4  1 2014-01-01 2014-03-05 23.73546  2014-04-01 2014-04-30 2127.622          0         0   0.00000
# 5  1 2014-03-05 2014-04-12 31.83643  2014-01-01 2014-01-31 1949.884          0         0   0.00000
# 6  1 2014-03-05 2014-04-12 31.83643  2014-02-01 2014-02-28 2014.691          0         0   0.00000
# 7  1 2014-03-05 2014-04-12 31.83643  2014-03-01 2014-03-31 1933.150          1        27 536.03354
# 8  1 2014-03-05 2014-04-12 31.83643  2014-04-01 2014-04-30 2127.622          1        12 270.94364

最新更新