当我将MATCH与动物园对象一起使用时,我不确定为什么我在索引中获得<NA>
。假设我有以下内容:
a <- read.zoo(data.frame(date=as.Date('2011-12-31') + 0:49, col1=seq(1,50), col2=seq(11,60)), FUN = as.Date)
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=LETTERS[1:3]), FUN = as.Date)
然后我尝试匹配:
mon$matched <- a[MATCH(index(mon),index(a))]$col1
然后我试着查看mon
现在的样子并收到错误:
View(mon) Error in View : missing values in 'row.names' are not allowed
再看看mon
,我不确定额外的<NA>
行来自哪里:
mon
mc mc2 matched
2012-01-01 a A 2
2012-02-01 b B 33
2012-03-01 c C <NA>
<NA> <NA> <NA> <NA>
做这场比赛的正确方法是什么?结果是正确的,除了最后一行,其中所有值都是<NA>
。我必须在这里做一些根本错误的事情......
您似乎正在尝试创建左连接。因为那个通常使用merge
。以下代码中显示的参数all = c(TRUE, FALSE)
的两个元素分别指的是我们是否在mon
和a
中保留了不匹配的日期。
库(动物园)
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
1)虽然如果你因为某些原因想要使用MATCH
而推荐上述方法而不是MATCH
,那么添加nomatch = 0
参数,使其为非匹配返回0而不是NA。这将导致索引只是简单地删除该值。对result$col1
的任务将在NA中进行隐含的merge
填充。
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的是时间索引,而不是行名称。
如果您查看a
对象,您会发现日期结束于
> a
col1 col2
2011-12-31 1 11
2012-01-01 2 12
<snipped most of them>
2012-02-16 48 58
2012-02-17 49 59
2012-02-18 50 60
所以在matched
的创作中你得到了:
MATCH(index(mon),index(a))
[1] 2 33 NA
这就是创造所有NA的行的原因
a[MATCH(index(mon),index(a)) ]
#--------
col1 col2
2012-01-01 2 12
2012-02-01 33 43
<NA> NA NA
从中您选择了col1
项目:
a[MATCH(index(mon),index(a))]$col1
#2012-01-01 2012-02-01 <NA>
# 2 33 NA
图书馆动物园中的[<-
功能与普通的[<-
方法完全不同。您可以使用以下命令检查代码:
getAnywhere(`[<-.zoo` )
它检查参数的数量并确定您给出的参数并相应地更改其逻辑。在诸如你的情况下,只给出x和i参数,它会进行匹配过程,从而在索引向量中产生额外的条目,因此创建了一条额外的行。可以说这不是一个预期的行动,并且可以说在这个过程的某个阶段应该有一个na.omit。其中一位动物园作家@ G.Grothendeick是常客,可能会进一步发表评论。如果是这样,他的话就是法律。如果你做na.omit你会得到预期的结果:
mon$matched <- na.omit(a[MATCH(index(mon),index(a))]$col1)
> mon
mc mc2 matched
2012-01-01 a A 2
2012-02-01 b B 33
2012-03-01 c C <NA>