(dplyr) Ошибка при использовании mutate (), case_when () и which () - PullRequest
0 голосов
/ 25 марта 2020

Нужна помощь с ошибками / предупреждениями в следующей ситуации:

У меня есть фрейм данных с датой наблюдения и вектором таких дат. Я хочу создать новые столбцы во фрейме данных со следующими и предыдущими датами наблюдения. Вектор дат создается как:

library(glue)

dates = c("201902",
          "201906",
          "201911",
          "202002")

dates = glue("{dates}01")

dates = dates%>%
        as.Date(format = "%Y%m%d")%>%
        sort()

Тогда в моем фрейме данных этот столбец состоит из dates элементов, называемых Date. Я хочу, чтобы он создавал столбцы со следующими и предыдущими датами, или оставлял их прежними, если это начало / конец. Я использую:

library(dplyr)

my_df = my_df%>%
mutate(First_date = (Date == dates[1]),
       Last_date = (Date == dates[length(dates)]),
       Prev_date = case_when(First_date ~ Date,
                                   TRUE ~ dates[which(dates == Date)-1]),
       Next_date = case_when(Last_date ~ Date,
                                  TRUE ~ dates[which(dates == Date)+1])

ПРИМЕР: Если бы у меня был кадр данных со следующим столбцом:

>my_df$Date
[1] "2019-02-01" "2019-06-01" "2019-11-01" "2020-02-01"

Я бы хотел, чтобы он заканчивался:

>my_df$First_date
[1] TRUE FALSE FALSE FALSE
>my_df$Last_date
[1] FALSE FALSE FALSE TRUE
>my_df$Prev_date
[1] "2019-02-01" "2019-02-01" "2019-06-01" "2019-11-01"
>my_df$Next_date
[1] "2019-06-01" "2019-11-01" "2020-02-01" "2020-02-01"

У тестового фрейма данных, который я использую, есть 6 строк, и он выдает эту ошибку и предупреждения:

Error: `TRUE ~ dates[which(dates == Date) + 1]` must be length 6 or one, not 2
Run `rlang::last_error()` to see where the error occurred.
In addition: Warning messages:
1: In `==.default`(dates, Date) :
  longer object length is not a multiple of shorter object length
2: In `==.default`(dates, Date) :
  longer object length is not a multiple of shorter object length

Я считаю, что это как-то связано с вызовом функции which() внутри case_when(), внутри mutate(), но мне не удалось точно выяснить, где это идет не так.

Я впервые спрашиваю здесь, извините за любую ошибку!

1 Ответ

0 голосов
/ 25 марта 2020

Хорошо, это должно сделать. Сначала ваш df:

dates = c("201902",
          "201906",
          "201911",
          "202002")

dates = glue("{dates}01")

dates = dates%>%
        as.Date(format = "%Y%m%d")%>%
        sort()

my_df <- data.frame(Date = dates)

Затем, используя функцию shift:

my_df <- my_df %>%
  mutate(First_date = ifelse(Date == dates[1], TRUE, FALSE),
         Last_date = ifelse(Date == dates[length(dates)], TRUE, FALSE),
         Prev_date = shift(dates, n = 1, fill = dates[1]),
         Next_date = shift(dates, n = -1, fill = dates[length(dates)]))
> my_df
        Date First_date Last_date  Prev_date  Next_date
1 2019-02-01       TRUE     FALSE 2019-02-01 2019-06-01
2 2019-06-01      FALSE     FALSE 2019-02-01 2019-11-01
3 2019-11-01      FALSE     FALSE 2019-06-01 2020-02-01
4 2020-02-01      FALSE      TRUE 2019-11-01 2020-02-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...