Как мне найти значение в другом объекте зоопарка? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь найти способ поиска значения в другом объекте зоопарка. Предположим, у меня есть следующие временные ряды:

a <- read.zoo(data.frame(date=as.Date('2011-12-31') + 0:8, reldt=c(rep(as.Date("2012-02-01"),3), rep(as.Date("2012-03-01"),3), rep(as.Date("2012-01-01"),3)), col2=seq(11,19)), FUN = as.Date)
a
           reldt      col2
2011-12-31 2012-02-01 11  
2012-01-01 2012-02-01 12  
2012-01-02 2012-02-01 13  
2012-01-03 2012-03-01 14  
2012-01-04 2012-03-01 15  
2012-01-05 2012-03-01 16  
2012-01-06 2012-01-01 17  
2012-01-07 2012-01-01 18  
2012-01-08 2012-01-01 19  

mon <- read.zoo(data.frame(date=c(as.Date('2012-01-01'), as.Date('2012-02-01'), as.Date('2012-03-01')), mc=letters[1:3], mc2=c(100,200,300)LETTERS[1:3]), FUN = as.Date)
mon
           mc mc2
2012-01-01 a  100
2012-02-01 b  200
2012-03-01 c  300

Для каждого reldt в a я бы хотел посмотреть значение в столбце mon.mc2. Другими словами, я хотел бы добавить соответствующие значения в столбце mon.mc2 к a, чтобы у меня был столбец a.mc2, который соответствует a.reldt=index(mon)

Вот что я попробовал (как я знаю, это работает для data.frame, но, похоже, не работает для объектов зоопарка). ЭТО НЕ ПРАВИЛЬНО ВЫРАВНИВАЕТСЯ ДЛЯ НЕКОТОРЫХ ПРИЧИН (Я подозреваю, что объекты зоопарка не соблюдают порядок индексов, возвращаемый match(...)):

a$mc2 <- as.numeric(coredata(mon[match(as.Date(coredata(a$reldt)), as.Date(index(mon)))]$mc2))

Вот объект зоопарка, который я хотел бы вывести:

          reldt      col2 mc2
2011-12-31 2012-02-01 11   200
2012-01-01 2012-02-01 12   200
2012-01-02 2012-02-01 13   200
2012-01-03 2012-03-01 14   300
2012-01-04 2012-03-01 15   300
2012-01-05 2012-03-01 16   300
2012-01-06 2012-01-01 17   100
2012-01-07 2012-01-01 18   100
2012-01-08 2012-01-01 19   100

ПРИМЕЧАНИЕ. Я бы предпочел решение Base R с использованием zoo, но это было бы интересно посмотреть другие пакеты, которые могут быть полезны

Ответы [ 2 ]

2 голосов
/ 20 апреля 2019

Как отмечается в комментариях, a и mon являются объектами персонажа-зоопарка, что необычно; тем не менее, мы можем сделать это, сопоставив a$reldt с as.character(time(mon)). Из этого создайте новый объект зоопарка mc2 и объедините его с a.

 mc2 <- zoo( coredata(mon$mc2)[match(a$reldt, as.character(time(mon)))], time(a) )
 cbind(a, mc2)
1 голос
/ 19 апреля 2019

Я бы порекомендовал сначала поработать с фреймами данных и соединить их, а затем преобразовать в объект зоопарка (если вы действительно этого хотите).Объединение может быть легко сделано с пакетом dplyr.В следующем коде a2 и mon2 являются версиями data.frame a и mon.

a2 <- data.frame(date=as.Date('2011-12-31') + 0:8, reldt=c(rep(as.Date("2012-02-01"),3), rep(as.Date("2012-03-01"),3), rep(as.Date("2012-01-01"),3)), col2=seq(11,19))

mon2 <- data.frame(date = c(as.Date('2012-01-01'), as.Date('2012-02-01'), as.Date('2012-03-01')), mc=letters[1:3], 
                  mc2=c(100,200,300))

library(dplyr)
library(zoo)
left_join(a2, mon2 %>% select(-mc), by = c("reldt" = "date")) %>%
  read.zoo(FUN = as.Date)

           reldt      col2 mc2
2011-12-31 2012-02-01 11   200
2012-01-01 2012-02-01 12   200
2012-01-02 2012-02-01 13   200
2012-01-03 2012-03-01 14   300
2012-01-04 2012-03-01 15   300
2012-01-05 2012-03-01 16   300
2012-01-06 2012-01-01 17   100
2012-01-07 2012-01-01 18   100
2012-01-08 2012-01-01 19   100
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...