Ошибка в mutate_impl (.data, точки): столбец `..........` должен иметь длину ... (размер группы) или один, а не - PullRequest
0 голосов
/ 01 марта 2019

У меня есть следующий фрейм данных:

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

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Я решил проблему сам.Казалось, что проблема с качеством данных, о которой я не знал.

Так что, если вы делаете group_by, вы должны быть уверены, что нет никаких повторяющихся строк с функцией samen, но сразные date.start и / или date.end.

0 голосов
/ 01 марта 2019

Если у вас разные годы, поэтому он не работает в вашем первом случае (2015 г. против 2020 г. - у вас есть 6 строк для заполнения, и вы пытаетесь поместить последовательность между 2015 и 2020 гг., Следовательно, с ошибкой), тогдамы можем использовать размер группы n() для создания последовательности, то есть

library(tidyverse)
library(splitstackshape)

expandRows(mydf, "Number.of.Years", drop = FALSE) %>% 
   group_by(grp = cumsum(!duplicated(paste0(Date.Start, Date.End)))) %>% 
   mutate(Date = seq(first(Date.Start), (first(Date.Start)+n()-1), by = 1))

, что дает

# A tibble: 9 x 5
# Groups:   grp [2]
  Date.Start Date.End   Number.of.Years   grp Date      
  <date>     <date>               <dbl> <int> <date>    
1 2015-09-01 2015-09-03               3     1 2015-09-01
2 2015-09-01 2015-09-03               3     1 2015-09-02
3 2015-09-01 2015-09-03               3     1 2015-09-03
4 2017-09-10 2020-09-15               6     2 2017-09-10
5 2017-09-10 2020-09-15               6     2 2017-09-11
6 2017-09-10 2020-09-15               6     2 2017-09-12
7 2017-09-10 2020-09-15               6     2 2017-09-13
8 2017-09-10 2020-09-15               6     2 2017-09-14
9 2017-09-10 2020-09-15               6     2 2017-09-15
...