which () с объектами типа символов - PullRequest
1 голос
/ 24 ноября 2011

У меня есть вопросы, которые могут быть слишком простыми, но вот они ...

Я хочу извлечь ежемесячные данные из набора данных, например:

    Date     Obs
1 2001-01-01 120
2 2001-01-02 100
3 2001-01-03 150
4 2001-01-04 175
5 2001-01-05 121
6 2001-01-06 100

Я просто хочучтобы получить строки из данных, где у меня есть определенный месяц (например, январь), это прекрасно работает:

output=which(strftime(dataset[,1],"%m")=="01",dataset[,1])

Однако, когда я пытаюсь создать цикл, чтобы пройти все месяцы, используя переменную, котораяу объявленного есть символ, он не работает, и я получаю только «ЛОЖЬ».

value=as.character(k)
output=which(strftime(dataset[,1],"%m")==value,dataset[,1])

Ответы [ 3 ]

4 голосов
/ 24 ноября 2011

Do not анализирует даты как строки. Это слишком подвержено ошибкам. Разобрать даты как даты и провести их логическое сравнение.

Вот один из подходов: создание данных за январь-март и подстановка февраля на основе сравнения:

R> output <- data.frame(date=seq(as.Date("2011-01-01"), by=7, length=10), 
+                       value=cumsum(runif(10)*100))
R> output
         date     value
1  2011-01-01   8.29916
2  2011-01-08  44.82950
3  2011-01-15  72.08662
4  2011-01-22 134.19277
5  2011-01-29 221.67744
6  2011-02-05 245.77195
7  2011-02-12 314.82081
8  2011-02-19 396.34661
9  2011-02-26 437.14286
10 2011-03-05 442.41321
R> output[ output[,"date"] >= as.Date("2011-02-01") & 
+          output[,"date"] <= as.Date("2011-02-28"), ]
        date   value
6 2011-02-05 245.772
7 2011-02-12 314.821
8 2011-02-19 396.347
9 2011-02-26 437.143
R> 

Другой подход использует пакет xts:

R> oo <- xts(output[,"value"], order.by=output[,"date"])
R> oo
                [,1]
2011-01-01   8.29916
2011-01-08  44.82950
2011-01-15  72.08662
2011-01-22 134.19277
2011-01-29 221.67744
2011-02-05 245.77195
2011-02-12 314.82081
2011-02-19 396.34661
2011-02-26 437.14286
2011-03-05 442.41321
R> oo["2011-02-01::2011-02-28"]
               [,1]                 
2011-02-05 245.772
2011-02-12 314.821
2011-02-19 396.347
2011-02-26 437.143
R> 

, поскольку xts имеет удобный анализ даты для индекса; подробности смотрите в документации к пакету.

3 голосов
/ 24 ноября 2011

Я предполагаю, что k - это целое число в 1:12. Я подозреваю, что вам лучше использовать сокращенные названия месяцев:

value <- month.abb[k]
output <- which(strftime(dataset[,1],"%b")==value,dataset[,1])

Причина, по которой вы не работаете, состоит в том, что номер месяца заполнен нулями и "1" != "01".

2 голосов
/ 24 ноября 2011

Вы также можете использовать даты как даты с POSIXlt()$mon

as.POSIXlt(output$date)$mon  # Note that Jan = 0 and Feb=1
 [1] 0 0 0 0 0 1 1 1 1 2

Существует несколько других пакетов, таких как chron, lubridate и gdata, которые предоставляют функции обработки даты.Я нашел функции в lubridate особенно интуитивно понятными и менее подверженными ошибкам в моих неуклюжих руках.

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