在执行计算时将单个数据框行拆分为多行
Splitting single data frame row into multiple rows while performing calculation
我有一个类似于 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
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.
我有一个类似于 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
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.