R: Выбор подмножества даты и времени с условием "ГГГГ-ММ"
Мои данные структурированы следующим образом:
curr time
<chr> <date>
1 USD 2015-07-18
2 USD 2014-10-16
3 USD 2016-03-26
Вопрос:
Мне нравится выбирать полный месяц
subset(ks, deadline >= '2010-01' & deadline <= '2016-03')
Это возвращает
Error in charToDate(x) :
character string is not in a standard unambiguous format.
Это работает, но всегда нужно вручную проверять дни месяцев.
subset(ks, deadline >= '2010-01-01' & deadline <= '2016-03-31')
Есть ли способ заставить работать первую "ошибочную" версию?
2 ответа
У меня только длинный подход здесь! Условие проверки состоит из 3 частей:
Все годы со всеми месяцами в интервале: например. в нашем случае с 2010 по 2015 годы учитываются все месяцы.
Последний год: здесь может быть задействовано всего несколько месяцев. Например, с 2016 года рассматриваются только первые 3 месяца. То же самое для начального года
library(lubridate) log.cond <- (year(dt$time) %in% 2010:2015) | (year(dt$time) == 2016 & month(dt$time) %in% 1:3) subset(dt, log.cond)
Кажется, что все ваши даты и сроки в символьном формате. Лучше всего использовать форматы даты (например, очень полезное семейство функций ymd
, ymd_hms
, year
, month
и т.д. от lubridate
пакет) Но если они расположены в англоязычном порядке (сначала год, затем месяц, затем день, с ведущими нулями), вам на самом деле не нужно превращать их в подмножества дат, вы можете оставить все в текстовом формате, вырезать последние 3 символа (дни) и R сделают числовые сравнения:
ks = data.frame(curr="USD", "time"=c("2015-07-18", "2014-10-16", "2016-03-26"), stringsAsFactors = F)
ks$time2 <- substr(ks$time, 1, nchar(ks$time)-3)
Тогда вы можете использовать свой первый синтаксис без каких-либо изменений:
subset(ks, time2 >= '2015-01' & time2 <= '2016-03')
#### curr time time2
#### 1 USD 2015-07-18 2015-07
#### 3 USD 2016-03-26 2016-03