【问题标题】:Convert multiple year and month pay data in a monthly sum R将多个年份和月份的工资数据转换为每月总和 R
【发布时间】:2017-06-08 17:04:53
【问题描述】:

在 R 中:我加入了两个文件。两者都包含佣金支付数据,我有两个文件,因为工作代码的支付结构周期不同。例如,文件一中的所有职位代码每月支付佣金,文件二中的所有职位代码每两个月支付佣金。 为了准确和公平地分析我需要为每个员工 ID(目前是一个因素)按月将(总和)工资汇总到一个新字段(我们称之为“月薪”)的数据,我的问题是我似乎成功地总结了每个员工的月薪,但目前它忽略了不同的年份。我不反对将 2015 年 6 月至 2017 年 6 月的年份和月份或虚拟编码作为 1 至 24 月份的工资月份进行传播,但我想知道是否有办法一次性做到这一点?

当前:

Check_DT   EMPLID   DEPTID JOBCODE PAY_FREQUENCY MAX._TTL.GROSS
2015-12-18 99999999 23231606  100880             W           1203
2015-12-24 99999999 23231606  100880             W            597
2015-12-31 99999999 23231606  100880             W            625
2016-01-08 99999999 23231606  100880             W            245
2016-01-13 99999999 23231606  100880             W            480
2016-01-15 99999999 23231606  100880             W            758
2016-01-22 99999999 23231606  100880             W            599
2016-01-29 99999999 23231606  100880             W            551
2016-02-05 99999999 23231606  100880             W            767
2016-02-12 99999999 23231606  100880             W            880
2016-02-19 99999999 23231606  100880             W            557
2016-02-26 99999999 20441606  100880             W            909
2016-03-04 99999999 20441606  100880             W            989
2016-03-11 99999999 20441606  100880             W            751
2016-03-18 99999999 20441606  100880             W            776
2016-03-25 99999999 20441606  100880             W            770
2016-04-01 99999999 20441606  100880             W            712
2016-04-08 99999999 20441606  100880             W            602
2016-04-15 99999999 20441606  100880             W            798
2016-04-22 99999999 20441606  100880             W            527

我想要什么(实际上需要,我要运行聚类分析):

>Check_DT   EMPLID   DEPTID JOBCODE PAY_FREQUENCY MAX._TTL.GROSS Year Month Pay
>2015-12-18 99999999 23231606  100880             W           1203 2015 12 2425
>2015-12-24 99999999 23231606  100880             W            597 
>2015-12-31 99999999 23231606  100880             W            625
>2016-01-08 99999999 23231606  100880             W            245 2016 01 2633
>2016-01-13 99999999 23231606  100880             W            480
>2016-01-15 99999999 23231606  100880             W            758
>2016-01-22 99999999 23231606  100880             W            599
>2016-01-29 99999999 23231606  100880             W            551
>2016-02-05 99999999 23231606  100880             W            767
>2016-02-12 99999999 23231606  100880             W            880
>2016-02-19 99999999 23231606  100880             W            557
>2016-02-26 99999999 20441606  100880             W            909
>2016-03-04 99999999 20441606  100880             W            989
>2016-03-11 99999999 20441606  100880             W            751
>2016-03-18 99999999 20441606  100880             W            776
>2016-03-25 99999999 20441606  100880             W            770
>2016-04-01 99999999 20441606  100880             W            712
>2016-04-08 99999999 20441606  100880             W            602
>2016-04-15 99999999 20441606  100880             W            798
>2016-04-22 99999999 20441606  100880             W            527

等等...我什至不反对年月日组合重复,我可以去掉重复。提醒一下,文件中的一些人每周支付一次,而另一些人每两个月支付一次。

这是我所做的:

#Convert weekly/bimonthly pay to monthly sum of pay
  paydat_all$monthlypay <- month(paydat_all$Check_DT)
  aggregate(MAX._TTL.GROSS~monthlypay+EMPLID, FUN = sum, data = paydat_all)  

【问题讨论】:

    标签: r


    【解决方案1】:

    这应该会为您提供所需的结果

    library(lubridate)
    library(dplyr)
    
     data = 'Check_DT   EMPLID   DEPTID JOBCODE PAY_FREQUENCY MAX._TTL.GROSS
    "2015-12-18" 99999999 23231606  100880             W           1203
    "2015-12-24" 99999999 23231606  100880             W            597
    "2015-12-31" 99999999 23231606  100880             W            625
    "2016-01-08" 99999999 23231606  100880             W            245
    "2016-01-13" 99999999 23231606  100880             W            480
    "2016-01-15" 99999999 23231606  100880             W            758
    "2016-01-22" 99999999 23231606  100880             W            599
    "2016-01-29" 99999999 23231606  100880             W            551
    "2016-02-05" 99999999 23231606  100880             W            767
    "2016-02-12" 99999999 23231606  100880             W            880
    "2016-02-19" 99999999 23231606  100880             W            557
    "2016-02-26" 99999999 20441606  100880             W            909
    "2016-03-04" 99999999 20441606  100880             W            989
    "2016-03-11" 99999999 20441606  100880             W            751
    "2016-03-18" 99999999 20441606  100880             W            776
    "2016-03-25" 99999999 20441606  100880             W            770
    "2016-04-01" 99999999 20441606  100880             W            712
    "2016-04-08" 99999999 20441606  100880             W            602
    "2016-04-15" 99999999 20441606  100880             W            798
    "2016-04-22" 99999999 20441606  100880             W            527'
    
    paydat_all <- read.table(text=data, header=TRUE, 
                             colClasses=c("Date", "character", "character", 
                                          "character", "factor", "integer"))
    
    paydat_all <- paydat_all %>%
                  mutate(Year = year(Check_DT),
                         Month = month(Check_DT)) %>%
                  group_by(EMPLID, DEPTID, JOBCODE, Year, Month) %>%
                  summarise(sum(MAX._TTL.GROSS))
    

    【讨论】:

    • 我正在尝试使用第二个版本并收到以下错误,突变只能与整数一起使用吗?:“mutate_impl(.data, dots) 中的错误:无效的下标类型“整数”
    • 嗨,马特,感谢您花时间更新您的回复,但我有一个有趣的现象发生,大多数情况下一切都是准确的,但对于某些员工,该文件会在某一年产生两行和月份,将工资分成一个两个月,另一个分三个月。但是,它并不是每 5 个支付月都这样做......你认为这里发生了什么?
    • NVM,因为 Job Code 不一样
    • 无论如何要生成相同的扁平化版本,甚至更多地转换为每个 EMPID 的平均任期工资?我正在尝试以下方法,但我对此很烂。我更像是一名数据分析师而不是一名数据科学家,所以我一直在学习课程,但还没有能够应用我自己成功的代码。我喜欢 R 用于统计目的,并想通过 SAS 学习语言。这是我所拥有的...avgpaydat_alltechs % mutate(AllPay = MonthlyPay) %>% group_by(CO, EMPLID, DEPTID, JOBCODE, PAY_FREQUENCY, Year, Month) %>% summarise(mean(MonthlyPay))
    • 我刚刚使用聚合创建了一个新字段
    【解决方案2】:

    考虑使用 base R 的 ave 进行内联聚合,其中:

    • 第一个参数是要聚合的列
    • 后面的一个或多个逗号分隔的参数是要分组的因素水平
    • 具有显式名为 FUN 的聚合类型参数。

    R 脚本

    data = 'Check_DT   EMPLID   DEPTID JOBCODE PAY_FREQUENCY MAX._TTL.GROSS
    "2015-12-18" 99999999 23231606  100880             W           1203
    "2015-12-24" 99999999 23231606  100880             W            597
    "2015-12-31" 99999999 23231606  100880             W            625
    "2016-01-08" 99999999 23231606  100880             W            245
    "2016-01-13" 99999999 23231606  100880             W            480
    "2016-01-15" 99999999 23231606  100880             W            758
    "2016-01-22" 99999999 23231606  100880             W            599
    "2016-01-29" 99999999 23231606  100880             W            551
    "2016-02-05" 99999999 23231606  100880             W            767
    "2016-02-12" 99999999 23231606  100880             W            880
    "2016-02-19" 99999999 23231606  100880             W            557
    "2016-02-26" 99999999 20441606  100880             W            909
    "2016-03-04" 99999999 20441606  100880             W            989
    "2016-03-11" 99999999 20441606  100880             W            751
    "2016-03-18" 99999999 20441606  100880             W            776
    "2016-03-25" 99999999 20441606  100880             W            770
    "2016-04-01" 99999999 20441606  100880             W            712
    "2016-04-08" 99999999 20441606  100880             W            602
    "2016-04-15" 99999999 20441606  100880             W            798
    "2016-04-22" 99999999 20441606  100880             W            527'
    
    paydat_all <- read.table(text=data, header=TRUE, 
                             colClasses=c("Date", "character", "character", 
                                          "character", "factor", "integer"))
    # MONTH AND YEAR
    paydat_all[c("Month", "Year")] <- sapply(c("%m", "%y"), 
                                             function(d) format(paydat_all$Check_DT, d))
    
    # THREE GROUP BY VARS WITH FORMAT() TO EXTRACT DATE TYPES
    paydat_all$PaySum <- ave(paydat_all$`MAX._TTL.GROSS`, paydat_all$Month, 
                             paydat_all$Year, paydat_all$EMPLID, FUN=sum)
    head(paydat_all)
    #     Check_DT   EMPLID   DEPTID JOBCODE PAY_FREQUENCY MAX._TTL.GROSS Month Year PaySum
    # 1 2015-12-18 99999999 23231606  100880             W           1203   12    15   2425
    # 2 2015-12-24 99999999 23231606  100880             W            597   12    15   2425
    # 3 2015-12-31 99999999 23231606  100880             W            625   12    15   2425
    # 4 2016-01-08 99999999 23231606  100880             W            245   01    16   2633
    # 5 2016-01-13 99999999 23231606  100880             W            480   01    16   2633
    # 6 2016-01-15 99999999 23231606  100880             W            758   01    16   2633
    

    【讨论】:

    • 太棒了,它看起来几乎完全符合我的要求,只需翻转“%m”、“%y”;)
    • 哎呀!绝对是笔误。相应地进行了编辑。我希望解决方案有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2013-02-17
    相关资源
    最近更新 更多