R 将行日期转换为列天数

时间:2021-06-11 17:08:19

标签: r

我将此输入作为 data.frame

dnm2<-data.frame(  id=as.character(c("AA","AA","AA","AA","AA","AA","AA","AA","AA","AA","AA","BB","BB","BB","BB","BB","BB","BB","BB")),
  dte=as.Date(c("2018-01-31","2018-02-01","2018-02-02","2018-02-03","2018-02-04","2018-02-05","2018-02-06","2018-02-07","2018-02-08","2018-02-09","2018-02-10","2018-01-29","2018-01-30","2018-01-31","2018-02-01","2018-02-02","2018-02-03","2018-02-04","2018-02-05")),
  varx=c(3,2,4,5,4,4,3,5,3,2,3,2,5,3,3,1,2,1,3))


> dnm2
   id        dte varx
1  AA 2018-01-31    3
2  AA 2018-02-01    2
3  AA 2018-02-02    4
4  AA 2018-02-03    5
5  AA 2018-02-04    4
6  AA 2018-02-05    4
7  AA 2018-02-06    3
8  AA 2018-02-07    5
9  AA 2018-02-08    3
10 AA 2018-02-09    2
11 AA 2018-02-10    3
12 BB 2018-01-29    2
13 BB 2018-01-30    5
14 BB 2018-01-31    3
15 BB 2018-02-01    3
16 BB 2018-02-02    1
17 BB 2018-02-03    2
18 BB 2018-02-04    1
19 BB 2018-02-05    3

我想要的是将行日期转换为列工作日。 哪种方法最简单?像这样:

id  firstDate    lastDate Mon_varx Tue_varx Wed_varx Thu_varx Fri_varx Sat_varx Sun_varx
AA 2018-01-29  2018-02-04                          3        2        4        5        4
AA 2018-02-05  2018-02-11        4        3        5        3        2        3
BB 2018-01-29  2018-02-04        2        5        3        3        1        2        1
BB 2018-02-05  2018-02-11        3

1 个答案:

答案 0 :(得分:0)

你可以这样做:

library(tidyverse)
library(lubridate)
dnm2 %>%
  mutate(day = format(dte, "%a_varx"), 
         firstDate = floor_date(dte, 'week') + days(1), 
         lastDate = ceiling_date(dte, 'week'))%>%
  pivot_wider(c(id, firstDate, lastDate), names_from = day, values_from = varx)

# A tibble: 4 x 10
  id    firstDate  lastDate   Wed_varx Thu_varx Fri_varx Sat_varx Sun_varx Mon_varx Tue_varx
  <chr> <date>     <date>        <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1 AA    2018-01-29 2018-02-04        3        2        4        5       NA       NA       NA
2 AA    2018-02-05 2018-02-11        5        3        2        3        4        4        3
3 BB    2018-01-29 2018-02-04        3        3        1        2       NA        2        5
4 BB    2018-02-05 2018-02-11       NA       NA       NA       NA        1        3       NA

EDTI:

dnm2 %>%
  mutate(day = format(dte, "%a_varx"), 
         firstDate = floor_date(dte, 'week'), 
         firstDate = if_else(firstDate == dte, dte - weeks(1), firstDate) + days(1), 
         lastDate = ceiling_date(firstDate, 'week')) %>%
  pivot_wider(c(id, firstDate, lastDate), names_from = day, values_from = varx)
id    firstDate  lastDate   Wed_varx Thu_varx Fri_varx Sat_varx Sun_varx Mon_varx Tue_varx
  <chr> <date>     <date>        <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>
1 AA    2018-01-29 2018-02-04        3        2        4        5        4       NA       NA
2 AA    2018-02-05 2018-02-11        5        3        2        3       NA        4        3
3 BB    2018-01-29 2018-02-04        3        3        1        2        1        2        5
4 BB    2018-02-05 2018-02-11       NA       NA       NA       NA       NA        3       NA