如何在另一个动物园对象中查找值?

问题描述 投票:0回答:2

我试图找到一种方法来查找另一个动物园对象中的值。假设我有以下时间序列:

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但似乎不适用于zoo对象)。它没有正确地对齐某些原因(我怀疑动物园对象不尊重match(...)返回的索引的顺序):

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

这是我想输出的zoo对象:

          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

注意:我更喜欢使用动物园的基础R解决方案,但看到其他可能有用的软件包会很有趣

r join dplyr time-series zoo
2个回答
2
投票

正如评论中所指出的,amon都是角色动物园对象,这是不寻常的;但是,我们仍然可以通过将a$reldtas.character(time(mon))相匹配来实现。从那里创建一个新的动物园对象mc2并与a合并。

 mc2 <- zoo( coredata(mon$mc2)[match(a$reldt, as.character(time(mon)))], time(a) )
 cbind(a, mc2)

1
投票

我建议首先使用数据框并加入它们,然后转换为动物园对象(如果你真的想要那样)。可以使用dplyr包轻松完成连接。在下面的代码中,a2mon2amon的data.frame版本。

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
© www.soinside.com 2019 - 2024. All rights reserved.