Как я могу создать новую переменную для сезонов из переменной даты? - PullRequest
2 голосов
/ 29 мая 2020

У меня есть фрейм данных комментариев, где один столбец df $ date соответствует датам, когда был сделан комментарий, как показано ниже:

[1] "2019-06-01" "2019-07-01" "2019-10-01" "2019-10-01" "2019-09-01" "2019-04-01" "2019-04-01" "2019-04-01" "2019-04-01"
 [10] "2019-04-01" "2018-08-01" "2018-08-01" "2018-08-01" "2018-07-01" "2018-08-01" "2018-07-01" "2018-07-01" "2018-06-01"

Я хочу добавить новый столбец с сезонами. По сути, я хочу сказать, что если бы дата была сделана между декабрем и февралем, то соответствующий сезон был бы зимой. Я пробовал следующее, но это дает мне: «Ошибка: несовместимо с запрошенным типом: [type = character; target = double].»

 df$season = ifelse(between(df$date,"2018-11-30", "2019-03-01"), "Invierno"
ifelse(between(df$date,"2019-02-28", "2019-06-01"),"Spring", ifelse(between(df$date,"2019-06-30", "2019-07-01"),"Summer",
"Fall")))

Означает ли это, что мне нужно переформатировать дату, чтобы или есть ли способ создать столбец сезонов, используя формат даты?

Заранее спасибо!

1 Ответ

1 голос
/ 29 мая 2020

Здесь происходят две вещи. Сначала вам нужно сообщить R, что вы хотите, чтобы строка даты действительно была датой, используя as.Date. Но когда этот вектор является датой, вы больше не можете использовать ifelse, потому что эта (очень полезная!) Функция не работает с датами. Так что это хорошая возможность представить синтаксис case_when dplyr, который выполняет то же самое, но более читаемым способом:

library(dplyr, warn.conflicts = FALSE)
date <- c("2019-06-01","2019-07-01","2019-10-01","2019-10-01","2019-09-01","2019-04-01","2019-04-01","2019-04-01","2019-04-01",
"2019-04-01","2018-08-01","2018-08-01","2018-08-01","2018-07-01","2018-08-01","2018-07-01","2018-07-01","2018-06-01")


df <- data.frame(date)

## first need to tell R that date is actually a date
df$date <- as.Date(df$date)

## Turns out that ifelse doesn't actually work well for dates so I'll introduce the glorious case_when function
df$season <- case_when(
  between(df$date, as.Date("2018-11-30"), as.Date("2019-03-01")) ~ "Invierno",
  between(df$date, as.Date("2019-02-28"), as.Date("2019-06-01")) ~ "Spring",
  between(df$date, as.Date("2019-06-30"), as.Date("2019-07-01")) ~ "Summer",
  TRUE ~ "Fall"
)

df
#>          date season
#> 1  2019-06-01 Spring
#> 2  2019-07-01 Summer
#> 3  2019-10-01   Fall
#> 4  2019-10-01   Fall
#> 5  2019-09-01   Fall
#> 6  2019-04-01 Spring
#> 7  2019-04-01 Spring
#> 8  2019-04-01 Spring
#> 9  2019-04-01 Spring
#> 10 2019-04-01 Spring
#> 11 2018-08-01   Fall
#> 12 2018-08-01   Fall
#> 13 2018-08-01   Fall
#> 14 2018-07-01   Fall
#> 15 2018-08-01   Fall
#> 16 2018-07-01   Fall
#> 17 2018-07-01   Fall
#> 18 2018-06-01   Fall

Создано 29 мая 2020 года пакет REPEX (v0.3.0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...