R zoo:在'中缺少值;行名称';不允许

R zoo:在'中缺少值;行名称';不允许,r,zoo,R,Zoo,我不确定当我使用与zoo对象匹配时,为什么索引中会出现。假设我有以下几点: 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-

我不确定当我使用与zoo对象匹配时,为什么索引中会出现
。假设我有以下几点:

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
我不确定额外的
行来自哪里:

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>   
mon
mc-mc2匹配
2012-01-01 a 2
2012-02-01乙33
2012-03-01 c

比赛的正确方式是什么?结果是正确的,但最后一行的所有值都是
。我一定是做错了什么…

如果你看一下
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
这就是所有NA的行的创建原因

a[MATCH(index(mon),index(a)) ]
 #--------
           col1 col2
2012-01-01    2   12
2012-02-01   33   43
<NA>         NA   NA

[似乎您正在尝试创建一个左联接。对于该联接,通常使用
合并
。下面代码中显示的参数
all=c(TRUE,FALSE)
的两个元素分别指的是我们是否在
mon
a
中保留不匹配的日期。
图书馆(动物园)

如果不需要带有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 col2
2012-01-01 a  A   2    12  
2012-02-01 b  B   33   43  
2012-03-01 c  C   <NA> <NA>
           mc mc2 col1
2012-01-01 a  A   2   
2012-02-01 b  B   33  
2012-03-01 c  C   <NA>
           col1 col2
2012-01-01    2   12
2012-02-01   33   43
           mc mc2 col1
2012-01-01 a  A   2   
2012-02-01 b  B   33  
2012-03-01 c  C   <NA>
匹配 1)尽管建议使用上述方法而不是
MATCH
,但如果出于某种原因想使用
MATCH
,请添加
nomatch=0
参数,使其返回0,而不是NA(非匹配)。这将导致索引简单地删除该值。分配给
result$col1
将执行隐式
合并
填充NA

result <- mon
result$col1 <- a$col1[MATCH(time(mon), time(a), nomatch = 0)]
result
其他
请注意,问题中所指的row.names是时间索引,而不是行名称。

因此基本上是左键将a连接到mon?如果它们是xts对象,
merge.xts(mon,a,join=“left”)
。不确定你为什么会得到na。也许@G.Grothendieck会顺便问一下这个问题,他可能知道你为什么会得到na。在
a[匹配(索引(mon),索引(a)]中最后一次关闭参数后,缺少逗号$col1
并且
a中的最后一个日期不匹配
,因此NA@42-逗号没有改变任何东西。与最后一个日期不匹配是可以的。我特别想弄清楚为什么最后一行的索引和所有数据都是NA。回答得好!谢谢你像往常一样解释得很好。谢谢。
           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>
merge(mon, a, all = c(TRUE, FALSE))$col1
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>
a[time(mon)]
           col1 col2
2012-01-01    2   12
2012-02-01   33   43
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 <- mon
result$col1 <- coredata(a$col1)[MATCH(time(mon), time(a))]
result