zoo:不允许在'row.names'中缺少值

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

当我将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>。我必须在这里做一些根本错误的事情......

r zoo
2个回答
2
投票

您似乎正在尝试创建左连接。因为那个通常使用merge。以下代码中显示的参数all = c(TRUE, FALSE)的两个元素分别指的是我们是否在mona中保留了不匹配的日期。 库(动物园)

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以从mona中消除不匹配的日期:

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的是时间索引,而不是行名称。


2
投票

如果您查看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> 
© www.soinside.com 2019 - 2024. All rights reserved.