如何在另一个动物园对象中查找值?
How do I lookup a value in another zoo object?
我正在尝试寻找一种在另一个动物园对象中查找值的方法。假设我有以下时间序列:
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
对于 a
中的每个 reldt
,我想查找列 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
NOTE: I would prefer a base R solution using zoo but it would be
interesting to see other packages that might be useful
我建议首先使用数据框并加入它们,然后转换为动物园对象(如果您确实需要的话)。
使用 dplyr
包可以轻松完成连接。在下面的代码中,a2
和 mon2
是 a
和 mon
的 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
如评论中所述,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)
我正在尝试寻找一种在另一个动物园对象中查找值的方法。假设我有以下时间序列:
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
对于 a
中的每个 reldt
,我想查找列 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
NOTE: I would prefer a base R solution using zoo but it would be interesting to see other packages that might be useful
我建议首先使用数据框并加入它们,然后转换为动物园对象(如果您确实需要的话)。
使用 dplyr
包可以轻松完成连接。在下面的代码中,a2
和 mon2
是 a
和 mon
的 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
如评论中所述,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)