работаю месяцами в зоопарке - PullRequest
       10

работаю месяцами в зоопарке

2 голосов
/ 05 сентября 2011

Я бы хотел дополнить объект зоопарка переменной, которую я мог бы использовать для проверки изменений месяца. Я уверен, что есть более общие способы сделать это. Предложения там были бы хорошими, но я хотел бы понять, почему этот простой подход терпит неудачу. Я бы почувствовал себя лучше, если бы понял, чего мне здесь не хватает ;-)

например. для объекта зоопарка

library(zoo)
tz <- structure(c(7L, 7L, 1L, 6L, 0L, 9L, 0L, 1L, 6L, 0L, 3L, 3L, 5L, 
0L, 8L, 2L, 0L, 3L, 2L, 5L, 2L, 3L, 4L, 7L, 8L, 9L, 0L, 1L, 4L, 
5L, 6L, 7L, 8L, 2L, 3L, 4L, 5L, 8L, 9L, 0L), .Dim = c(20L, 2L
), .Dimnames = list(NULL, c("x", "y")), index = structure(c(13880, 
13881, 13913, 13916, 13946, 13947, 13948, 13980, 13983, 13984, 
13985, 14016, 14048, 14082, 14083, 14115, 14147, 14180, 14212, 
14243), class = "Date"), class = "zoo")

Добавить переменную года / месяца, используя as.yearmon (), довольно просто. Если бы я был во фрейме данных, это дало бы прекрасную символьную переменную, но в зоопарке произошла трагедия, если вы забыли заключить в as.numeric ()

tz$yrmo <- as.numeric(as.yearmon(index(tstz)))
> head(tz)
           x y     yrmo
2008-01-02 7 2 2008.000
2008-01-03 7 3 2008.000
2008-02-04 1 4 2008.083
2008-02-07 6 7 2008.083
2008-03-08 0 8 2008.167
2008-03-09 9 9 2008.167

Это выглядит великолепно, и я могу успешно сравнивать элементы данных

(tz $ x [6]! = Tz $ y [6])
2008-03-09
ЛОЖЬ

но почему я получаю этот результат, когда сравниваю переменную год / месяц?

> (tz$yrmo[2] != tz$yrmo[1])
Data:
logical(0)

Index:
character(0)

и почему тестирование yearmon или элементов данных с идентичным () не проходит таким образом? (оба должны быть правдой)

> identical(tz$yrmo[2] , tz$yrmo[1])
[1] FALSE
> identical(tz$x[2] , tz$x[1])
[1] FALSE

Я просто играю с огнем в использовании yearmon (), который создает индексный класс в зоопарке? Должен ли я переключиться на что-то вроде «превращения даты в число месяца» Дирка Эддельбюттеля? Количество месяцев между двумя датами

1 Ответ

3 голосов
/ 05 сентября 2011

Q1: ключ к выводу, имеющему разделы Data и Index, состоит в том, что это объекты зоопарка. Таким образом, они имеют атрибуты индекса, которые сравниваются, и они не равны. Если вы хотите сравнить значения, вы можете получить доступ к coredata ():

> (coredata(tz$yrmo[2]) != coredata(tz$yrmo[1]))
[1] FALSE
> coredata(tz$yrmo[2])
[1] 2008
> coredata(tz$yrmo[1])
[1] 2008

Q2: identical проверяет не только числовые значения. Он также определяет равенство всех атрибутов.

> attributes(tz$yrmo[2])
$index
[1] "2008-01-03"

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