zoo: 'row.names' 中的缺失值是不允许的
zoo: missing values in 'row.names' are not allowed
我不确定为什么在对动物园对象使用 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>
。我一定是在做一些根本性的错误...
如果您查看 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>
您似乎正在尝试创建左连接。对于那个通常使用 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
参数,以便它 returns 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 是时间索引,而不是行名称。
我不确定为什么在对动物园对象使用 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>
。我一定是在做一些根本性的错误...
如果您查看 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>
您似乎正在尝试创建左连接。对于那个通常使用 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
参数,以便它 returns 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 是时间索引,而不是行名称。