Преобразование месячных данных в дневную таблицу в R - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть такой фрейм данных в R: -

NO_OF_EMPLOYMENT   MONTH    YEAR
127                 9        2017
125                 10       2017
120                 11       2017
130                 12       2017
110                 1        2018
125                 2        2018

Мне нужно преобразовать данные MONTH в дневные данные, и мой фрейм данных должен выглядеть следующим образом: -

    NO_OF_EMPLOYMENT   MONTH     YEAR  DAY
    127                 9        2017   1
    127                 9        2017   2
    127                 9        2017   3
    127                 9        2017   4
    .
    .

    .
    127                 9        2017   30
    125                 10       2017    1
    125                 10       2017    2

и так далее за каждый месяц. Я пытался найти похожий вопрос, но он не сработал.

данные

df <- read.table(text="
NO_OF_EMPLOYMENT   MONTH    YEAR
127                 9        2017
125                 10       2017
120                 11       2017
130                 12       2017
110                 1        2018
125                 2        2018", h = T)

Ответы [ 4 ]

0 голосов
/ 10 ноября 2018

Другой способ использования tidyverse и lubridate -

library(tidyverse)
library(lubridate)

df %>% 
  uncount(
    weights = days_in_month(make_date(YEAR, MONTH)),
    .id = "Day"
  )
0 голосов
/ 10 ноября 2018

Другой lubdridate / tidyverse способ:

library(tidyverse)
library(lubridate)
df %>%
  mutate(DAY = map2(
    YEAR, MONTH, ~seq(days_in_month(as.Date(str_c(.x,"-",.y,"-",1)))))) %>%
  unnest
#    NO_OF_EMPLOYMENT MONTH YEAR day
# 1               127     9 2017   1
# 2               127     9 2017   2
# 3               127     9 2017   3
# 4               127     9 2017   4
# ...
0 голосов
/ 10 ноября 2018

0 зависимость, в 2 раза быстрее решение base R:

read.table(text="NO_OF_EMPLOYMENT   MONTH    YEAR
    127                 9        2017
    125                 10       2017
    120                 11       2017
    130                 12       2017
    110                 1        2018
    125                 2        2018", header=TRUE) -> xdf

do.call(
  rbind.data.frame,
  lapply(1:nrow(xdf), function(idx) {
    time <- as.POSIXlt(as.Date(sprintf("%s-%02s-01", xdf$YEAR[idx], xdf$MONTH[idx])))
    time$mday[] <- time$sec[] <- time$min <- time$hour <- 0
    time$mon <- time$mon + 1
    data.frame(
      YEAR = xdf$YEAR[idx],
      MONTH = xdf$MONTH[idx],
      DAY = seq(1:as.POSIXlt(as.POSIXct(time))$mday),
      NO_OF_EMPLOYMENT = xdf$NO_OF_EMPLOYMENT[idx]
    )  
  })
)
0 голосов
/ 10 ноября 2018

Вот простой способ сделать это:

     mydata<-data.frame(NO_Empl=c(127,125,124),Month=c(9,8,7),Year=c(2017,2018,2017))
library(lubridate)
library(tidyverse)
as.tibble(mydata) %>% 
  mutate(Date=make_date(Year,Month)) %>% 
  select(-Month,-Year) %>% 
  mutate(Day=wday(Date),Day_date=month(Date))

Результат:

# A tibble: 3 x 4
  NO_Empl Date         Day Day_date
    <dbl> <date>     <dbl>    <dbl>
1     127 2017-09-01     6        9
2     125 2018-08-01     4        8
3     124 2017-07-01     7        7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...