Решение для повторяющихся значений в заданном диапазоне дат

Error in seq.Date(as.Date(retail$Valid_from), as.Date(retail$Valid_to),  : 
  'from' must be of length 1

Я пробовал оба метода, как указано в вопросе:

В основном я хочу повторить количество на каждый день в заданном диапазоне дат:

HSD_RSP            Valid_from   Valid_to
70                 1/1/2018     15/1/2018
80                 1/16/2018    1/31/2018
.
.
.

Способ 1:

byDay = ddply(retail, .(HSD_RSP), transform, 
              day=seq(as.Date(retail$Valid_from), as.Date(retail$Valid_to), by="day"))

Способ 2:

dt <- data.table(retail)
dt <- dt[,seq(as.Date(Valid_from),as.Date(Valid_to),by="day"),
         by=list(HSD_RSP)]

HSD_RSP      final_date
70             1/1/2018
70           2/1/2018
70           3/1/2018
70           4/1/2018
.
.
.

вывод

dput (голова (розничная))

structure(list(HSD_RSP = c(61.68, 62.96, 63.14, 60.51, 60.34, 
61.63), Valid_from = structure(c(1483315200, 1484524800, 1487116800, 
1491004800, 1491523200, 1492300800), class = c("POSIXct", "POSIXt"
), tzone = "UTC"), Valid_to = structure(c(1484438400, 1487030400, 
1490918400, 1491436800, 1492214400, 1493510400), class = c("POSIXct", 
"POSIXt"), tzone = "UTC")), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

person Dharight    schedule 25.09.2019    source источник
comment
В каком формате ваши даты? В вашем примере столбец valid_to имеет 2 разных формата.   -  person phiver    schedule 25.09.2019


Ответы (2)


Преобразование в дату, создание последовательности дат между Valid_from и Valid_to и unnest

library(tidyverse)

df %>%
  mutate_at(vars(starts_with("Valid")), as.Date, "%m/%d/%Y") %>%
  mutate(Date = map2(Valid_from, Valid_to, seq, by = "1 day")) %>%
  unnest(Date) %>%
  select(-Valid_from, -Valid_to)

#  HSD_RSP   Date      
#     <int> <date>    
# 1      70 2018-01-01
# 2      70 2018-01-02
# 3      70 2018-01-03
# 4      70 2018-01-04
# 5      70 2018-01-05
# 6      70 2018-01-06
# 7      70 2018-01-07
# 8      70 2018-01-08
# 9      70 2018-01-09
#10      70 2018-01-10
# … with 21 more rows

данные

df <- structure(list(HSD_RSP = c(70L, 80L), Valid_from = structure(1:2, 
.Label = c("1/1/2018", "1/16/2018"), class = "factor"), Valid_to = 
structure(1:2, .Label = c("1/15/2018", "1/31/2018"), class = "factor")),
class = "data.frame", row.names = c(NA, -2L))
person Ronak Shah    schedule 25.09.2019
comment
Привет, Ронак, я почему-то получаю ту же ошибку, я чувствую, что проблема связана с фреймом данных: HSD_RSP 00:00:00 - person Dharight; 25.09.2019
comment
@Dhavaldesai Можешь попробовать df %>% mutate_at(vars(starts_with("Valid")), as.Date) %>% mutate(Date = map2(Valid_from, Valid_to, seq, by = "1 day")) %>% unnest(Date) %>% select(-Valid_from, -Valid_to) - person Ronak Shah; 25.09.2019
comment
ваш код работает, когда даты valid_from и valid_to имеют одно значение, я требую, чтобы эти последовательности создавались каждые 15 дней в течение всего года. Было бы здорово, если бы вы могли мне помочь - person Dharight; 25.09.2019
comment
@Dhavaldesai Мне непонятно. Судя по вашим входным данным, у вас уже есть даты на каждые 15 дней. Пожалуйста, проверьте df в разделе данные моего ответа и сравните его с вашим. Если ваши данные отличаются, обновите свой пост с помощью dput(head(df)). Также убедитесь, в каком формате у вас есть входные данные, в своем посте вы показали их в формате "%m/%d/%Y", тогда как в комментарии вы также показали в нем компонент времени. - person Ronak Shah; 25.09.2019
comment
внесли изменения в ответ, можете посмотреть - person Dharight; 25.09.2019
comment
@Dhavaldesai еще не retail %>% mutate_at(vars(starts_with("Valid")), as.Date) %>% mutate(Date = map2(Valid_from, Valid_to, seq, by = "1 day")) %>% unnest(Date) %>% dplyr::select(-Valid_from, -Valid_to) дает вам ответ. Он создает последовательность дат между каждым Valid_from и Valid_to. Разве это не то, чего ты хочешь? - person Ronak Shah; 25.09.2019
comment
Но я продолжаю получать эту ошибку в mutate_impl(.data, dots): Ошибка оценки: неправильный знак в аргументе 'by'. - person Dharight; 25.09.2019
comment
@Dhavaldesai Не удалось воспроизвести, код, похоже, работает с вашими общими данными образца. насколько велики ваши данные? Можете ли вы поделиться полным фреймворком данных? dput(retail) ? - person Ronak Shah; 25.09.2019

Используя структуру данных Ронака Шаха, используя data.table:

library(data.table)     
dt <- as.data.table(df1)
dt[, .(final_date = seq(as.Date(Valid_from, "%m/%d/%Y"), as.Date(Valid_to, "%m/%d/%Y"), by = "day")),
   by = HSD_RSP]

    HSD_RSP final_date
 1:      70 2018-01-01
 2:      70 2018-01-02
 3:      70 2018-01-03
 4:      70 2018-01-04
 ....

данные:

df <- structure(list(HSD_RSP = c(70L, 80L), Valid_from = structure(1:2, 
.Label = c("1/1/2018", "1/16/2018"), class = "factor"), Valid_to = 
structure(1:2, .Label = c("1/15/2018", "1/31/2018"), class = "factor")),
class = "data.frame", row.names = c(NA, -2L))
person phiver    schedule 25.09.2019