Кажется, вы пытаетесь создать левое соединение.Для этого обычно используется merge
.Два элемента аргумента all = c(TRUE, FALSE)
, показанные в приведенном ниже коде, относятся к тому, сохраняем ли мы несопоставленные даты в mon
и a
соответственно.
library (zoo)
a <- zoo(cbind(col1 = 1:50, col2 = 11:60), as.Date("2011-12-31") + 0:49)
mon <- zoo(cbind(mc = letters[1:3], mc2 = LETTERS[1:3]),
as.Date(c('2012-01-01', '2012-02-01', '2012-03-01')))
merge(mon, a, all = c(TRUE, FALSE))
давая:
mc mc2 col1 col2
2012-01-01 a A 2 12
2012-02-01 b B 33 43
2012-03-01 c C <NA> <NA>
Если вы хотите только col1
, тогда:
merge(mon, a, all = c(TRUE, FALSE))$col1
Если вам не нужна строка с NA, укажите FALSE, чтобы исключить несоответствующие даты из mon
иa
:
merge(mon, a, all = FALSE)
ИНДЕКСИРОВАНИЕ ПО ВРЕМЕНИ
Это также можно сделать с помощью индексации времени следующим образом:
result <- mon
result$col1 <- a$col1[time(mon)] # does an implicit merge
result
, давая:
mc mc2 col1
2012-01-01 a A 2
2012-02-01 b B 33
2012-03-01 c C <NA>
Если вам не нужна строка NA, этого будет достаточно:
a[time(mon)]
, давая:
col1 col2
2012-01-01 2 12
2012-02-01 33 43
MATCH
1) Хотя вышеприведенные подходы рекомендуются вместо MATCH
, если вы по какой-то причине хотите использовать MATCH
, добавьте аргумент nomatch = 0
, чтобы он возвращал 0 вместо NA для несоответствий.Это приведет к тому, что индексирование просто отбросит это значение.Присвоение result$col1
будет выполнять неявное merge
заполнение NA.
result <- mon
result$col1 <- a$col1[MATCH(time(mon), time(a), nomatch = 0)]
result
, давая:
mc mc2 col1
2012-01-01 a A 2
2012-02-01 b B 33
2012-03-01 c C <NA>
result$dol1
можно использовать для получения только col1
.
2) Другой способ сделать это - следующий, который дает тот же результат.В этом случае правая часть имеет три элемента, третий из которых - NA, но поскольку правая часть теперь представляет собой простой вектор, она просто копирует элемент за элементом в результат $ col1, а не выполняет неявное слияние.
result <- mon
result$col1 <- coredata(a$col1)[MATCH(time(mon), time(a))]
result
Другое
Обратите внимание, что то, что в вопросе упоминается как row.names, является индексом времени, а не именами строк.