【问题标题】:zoo: missing values in 'row.names' are not allowed动物园:“row.names”中不允许缺失值
【发布时间】:2019-03-14 17:15:48
【问题描述】:

当我将 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,我不确定额外的&lt;NA&gt; 行来自哪里:

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>   

进行这场比赛的正确方法是什么?结果是正确的,除了最后一行的所有值都是&lt;NA&gt;。我必须在这里做一些根本错误的事情......

【问题讨论】:

  • 所以基本上 left_join 到 mon?如果它们是 xts 对象,merge.xts(mon, a, join = "left")。不知道为什么你会得到 na。也许@G。格洛腾迪克会问这个问题,他可能知道你为什么会得到 NA。
  • a[MATCH(index(mon),index(a))]$col1 中最后一个结束括号后缺少逗号,a 中的最后一个日期不匹配,因此 NA
  • @42- 逗号没有改变任何东西。最后日期的不匹配很好。我特别想弄清楚为什么最后一行的索引和所有数据都有 NA。

标签: r zoo


【解决方案1】:

您似乎正在尝试创建左连接。对于那个通常使用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 的赋值将执行一个隐含的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 是时间索引,而不是行名。

【讨论】:

  • 像往常一样很好的解释。谢谢。
【解决方案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 

library zoo 中的[&lt;- 函数与普通的[&lt;- 方法完全不同。您可以使用以下代码检查代码:

 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> 

【讨论】:

  • 很好的答案!谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2014-05-11
  • 2014-12-13
  • 2020-12-10
  • 1970-01-01
相关资源
最近更新 更多