У меня есть следующий фрейм данных:
mydf <- data.frame(Date.Start = as.Date(c("2015-09-01", "2015-09-10")),
Date.End = as.Date(c("2017-09-10", "2020-09-15")),
Number.of.Years = c(3, 6),
stringsAsFactors = FALSE)
# Date.Start Date.End Number.of.Years
#1 2015-09-01 2017-09-10 3
#2 2015-09-10 2020-09-15 6
Я пытаюсь «взорвать» фрейм данных одной строкой в год до:
# Date.Start Date.End Number.of.Years Year
#1 2015-09-01 2017-09-10 3 2015
#1 2015-09-01 2017-09-10 3 2016
#1 2015-09-01 2017-09-10 3 2017
#2 2017-09-10 2020-09-15 6 2015
#2 2017-09-10 2020-09-15 6 2016
#2 2017-09-10 2020-09-15 6 2017
#2 2017-09-10 2020-09-15 6 2018
#2 2017-09-10 2020-09-15 6 2019
#2 2017-09-10 2020-09-15 6 2020
Поэтому я попробовал следующее:
library(splitstackshape)
library(dplyr)
library(lubridate)
expandRows(mydf, "Number.of.Years", drop = FALSE) %>%
group_by(Date.Start, Date.End) %>%
mutate(Date = seq(year(first(Date.Start)),
year(first(Date.End)),
by = 1))
Но я получаю следующую ошибку:
Error in mutate_impl(.data, dots) :
Column `Date` must be length 6 (the group size) or one, not 4
Что не так в коде выше?
Если я пытаюсь изменить его на номердней (из другого поста на stackoverflow) он работает нормально, хотя:
mydf <- data.frame(Date.Start = as.Date(c("2015-09-01", "2015-09-10")),
Date.End = as.Date(c("2015-09-03", "2015-09-15")),
Number.of.Days = c(3, 6),
stringsAsFactors = FALSE)
library(splitstackshape)
library(dplyr)
library(lubridate)
expandRows(mydf, "Number.of.Days", drop = FALSE) %>%
group_by(Date.Start, Date.End) %>%
mutate(Date = seq(first(Date.Start),
first(Date.End),
by = 1))
# A tibble: 9 x 4
# Groups: Date.Start, Date.End [2]
# Date.Start Date.End Number.of.Days Date
# <date> <date> <dbl> <date>
#1 2015-09-01 2015-09-03 3 2015-09-01
#2 2015-09-01 2015-09-03 3 2015-09-02
#3 2015-09-01 2015-09-03 3 2015-09-03
#4 2015-09-10 2015-09-15 6 2015-09-10
#5 2015-09-10 2015-09-15 6 2015-09-11
#6 2015-09-10 2015-09-15 6 2015-09-12
#7 2015-09-10 2015-09-15 6 2015-09-13
#8 2015-09-10 2015-09-15 6 2015-09-14
#9 2015-09-10 2015-09-15 6 2015-09-15