генерировать строки для каждого идентификатора по дате - PullRequest
0 голосов
/ 02 января 2019

мой фрейм данных выглядит примерно так

df <- read.table(text="
                 id          start           end
    1            2      2018-10-01    2018-12-01
    2            3      2018-01-01    2018-04-01
", header=TRUE)

Я пытаюсь добиться разницы между началом и днем ​​в месяцах для каждого идентификатора, а затем сгенерировать новый кадр данных с каждым месяцем для конкретного идентификатора.Результат должен быть

result <- read.table(text="
                 id          date           
    1            2      2018-10-01
    2            2      2018-11-01
    3            2      2018-12-01     
    4            3      2018-01-01
    5            3      2018-02-01    
    6            3      2018-03-01    
    7            3      2018-04-01        
", header=TRUE)

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Мы можем сделать это легко с Map. Передайте Date преобразованный столбец 'start' и 'end' набора данных в качестве аргументов Map, получите последовательность 'month's как list и разверните' id 'на основе lengths из list а также объединить элементы list для создания расширенного фрейма данных

lst1 <- Map(seq, MoreArgs = list(by = 'month'), as.Date(df$start), as.Date(df$end))
data.frame(id = rep(df$id, lengths(lst1)), date = do.call(c, lst1))
#  id       date
#1  2 2018-10-01
#2  2 2018-11-01
#3  2 2018-12-01
#4  3 2018-01-01
#5  3 2018-02-01
#6  3 2018-03-01
#7  3 2018-04-01

Или, используя tidyverse, мы mutate class столбцов 'start', 'end' до Date, используя map2 (из purrr), получим seq значение даты от «начала» до «конца» by «месяца» и расширяют данные на unnest с набором данных

library(tidyverse)
df %>% 
  mutate_at(2:3, as.Date) %>% 
  transmute(id = id, date = map2(start, end,  ~ seq(.x, .y, by = 'month'))) %>% 
  unnest
#  id       date
#1  2 2018-10-01
#2  2 2018-11-01
#3  2 2018-12-01
#4  3 2018-01-01
#5  3 2018-02-01
#6  3 2018-03-01
#7  3 2018-04-01
0 голосов
/ 02 января 2019

Самый простой способ использования базовых функций R - создать seq число месячных дат для каждой строки, создать кадр данных и rbind их вместе

do.call(rbind, with(df,lapply(1:nrow(df), function(i) 
   data.frame(id = id[i], date = seq(as.Date(start[i]), as.Date(end[i]), by = "month")))))

#  id       date
#1  2 2018-10-01
#2  2 2018-11-01
#3  2 2018-12-01
#4  3 2018-01-01
#5  3 2018-02-01
#6  3 2018-03-01
#7  3 2018-04-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...