动物园:不允许在“ row.names”中缺少值

时间:2019-03-14 17:15:48

标签: r zoo

我不确定在对动物园对象使用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>以外,结果是正确的。我一定是在做一些根本错误的事情...

2 个答案:

答案 0 :(得分:2)

如果查看RESULT ID | COLB | COLC | SOURCE ------------------------------------------------- ABC102 | 1 | 1 | ABC101 对象,您会发现日期以

结尾
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

这就是创建所有NA行的原因

 MATCH(index(mon),index(a))
[1]  2 33 NA

从中选择了a[MATCH(index(mon),index(a)) ] #-------- col1 col2 2012-01-01 2 12 2012-02-01 33 43 <NA> NA NA 个项目:

col1

图书馆Zoo中的a[MATCH(index(mon),index(a))]$col1 #2012-01-01 2012-02-01 <NA> # 2 33 NA 函数与普通的[<-方法完全不同。您可以使用以下代码检查代码:

[<-

它检查参数的数量并确定您给的参数,并相应地更改其逻辑。在像您这样的情况下,仅给出x和i参数,它会执行匹配过程,从而导致索引向量中有额外的条目,因此会创建额外的行。可以说这不是预期的操作,并且可以说在此过程中的某个时刻应该应用一个命名规则。动物园的一位作者@ G.Grothendeick在这里是固定的,也许可以发表评论。如果是这样,他的话就是法律。如果不执行na.omit,则会得到预期的结果:

 getAnywhere(`[<-.zoo` ) 

答案 1 :(得分: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

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,但由于右侧现在是一个普通矢量,因此它只是逐个元素地复制到result $ col1中,而不是进行隐式合并。

result <- mon
result$col1 <- coredata(a$col1)[MATCH(time(mon), time(a))]
result

其他

请注意,问题中称为row.names的是时间索引,而不是行名。