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 частей:

  1. Все годы со всеми месяцами в интервале: например. в нашем случае с 2010 по 2015 годы учитываются все месяцы.

  2. Последний год: здесь может быть задействовано всего несколько месяцев. Например, с 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
Другие вопросы по тегам