我不确定在对动物园对象使用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>
以外,结果是正确的。我一定是在做一些根本错误的事情...
答案 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)
的两个元素分别表示我们是否分别在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的是时间索引,而不是行名。