【问题标题】:Splitting single data frame row into multiple rows while performing calculation在执行计算时将单个数据框行拆分为多行
【发布时间】:2023-12-12 05:34:01
【问题描述】:

我有一个类似于 df1 的 df,我想在其中拆分行,以便 HOURS 列的间隔为 4,如 df2 所示。我将如何解决这个问题以及推荐哪些软件包?

ID 在某一天可以有多个序列。例如,一个 ID 可以在给定的一天列出 2-3 次,分配多个单元和多个 CODE。

以下是必需的:

  • 所有分类数据在子行上必须保持不变(例如,CODE 在每个子行上保持不变)
  • 如果余数小于四,则应在最后一行列出余数(例如,df2;B 行)
  • 如果子行在下一个日期开始或结束,则日期列应相应更新(例如,df2;E 行)

df1(当前)

EMPLID TIME_RPTG_CD START_DATE_TIME     END_DATE_TIME       Hrs_Time_Worked
   <chr>  <chr>        <dttm>              <dttm>                        <dbl>
 1 X00007 REG          2014-07-03 16:00:00 2014-07-03 02:00:00            10.0

df2(需要)

 EMPLID TIME_RPTG_CD START_DATE_TIME     END_DATE_TIME       Hrs_Time_Worked
   <chr>  <chr>        <dttm>              <dttm>                        <dbl>
1 X00007 REG          2014-07-03 16:00:00 2014-07-03 20:00:00            4.0
1 X00007 REG          2014-07-03 20:00:00 2014-07-04 24:00:00            4.0
1 X00007 REG          2014-07-04 24:00:00 2014-07-04 02:00:00            2.0

【问题讨论】:

    标签: r dataframe split rows calculated-columns


    【解决方案1】:
    library(tidyverse)
    library(lubridate)
    df1%>%
     group_by(Row)%>%
     mutate(S=paste(START_DATE,START_TIME),
            HOURS=list((n<-c(rep(4,HOURS%/%4),HOURS%%4))[n!=0]))%>%
     unnest()%>%
     mutate(E=dmy_hm(S)+hours(cumsum(HOURS)),
            S=E-hours(unlist(HOURS)),
            START_DATE=format(S,"%d-%b-%y"),
            END_DATE=format(E,"%d-%b-%y"),
            START_TIME=format(S,"%H:%M"),
            END_TIME=format(E,"%H:%M"),S=NULL,E=NULL)
    # A tibble: 6 x 9
    # Groups:   Row [3]
      Row      ID UNIT  CODE  START_DATE END_DATE  START_TIME END_TIME HOURS
      <chr> <int> <chr> <chr> <chr>      <chr>     <chr>      <chr>    <dbl>
    1 A         1 3ESD  REG   06-Aug-14  06-Aug-14 01:00      05:00       4.
    2 A         1 3ESD  REG   06-Aug-14  06-Aug-14 05:00      07:00       2.
    3 B         2 3E14E OE2   12-Aug-14  13-Aug-14 21:00      01:00       4.
    4 C         3 3E5E  REG   19-Aug-14  20-Aug-14 21:00      01:00       4.
    5 C         3 3E5E  REG   20-Aug-14  20-Aug-14 01:00      05:00       4.
    6 C         3 3E5E  REG   20-Aug-14  20-Aug-14 05:00      07:00       2.
    

    【讨论】:

    • 运行代码时出现错误:“mutate_impl(.data, dots) 中的错误:评估错误:无效类 Period 对象:句点必须有整数值。”这是我的格式问题吗?
    • 您是否在使用您提供的数据?我已经很久没有回答这个问题了。我什至不记得发生了什么
    • 我刚刚更新了帖子中的数据以说明格式。与原版略有不同。感谢您的帮助
    • 您应该能够从这个答案中获得有关如何解决手头问题的想法。在提出问题 5 天后更改数据结构不会有太大帮助。或者更确切地说,你可以问另一个问题。在这种情况下,你甚至可能得到比这更好的解决方案。解决您所有问题的解决方案
    • 我能够通过在第二个 mutate 函数中使用 dhours() 而不是 hours() 来使代码工作。再次感谢!
    最近更新 更多