2011-12-01 47 views
6

假设我有一个载体x<-c(1,2,NA,4,5,NA)载体之间的区别_including_ NA

我申请了一些神话的代码是向量,这会导致另一个载体,y<-c(1,NA,3, 4,10,NA)

现在我想找出在哪个位置我的两个向量不同,在那里我计为两个NA S作为是相同的和一个NA和一个非NA(例如两个示例向量的第二个元素)。

具体来说,对于我的例子,我想结束一个向量持有c(2,3,5)

对于我的用例,我不满足于一个逻辑变量向量,但显然我可以很容易地转换(which),所以我也会接受。

我有这样一些解决方案:

simplediff<-x!=y 
nadiff<-is.na(x)!=is.na(y) 
which(simplediff | nadiff) 

但感觉像我在这里重新发明轮子。有更好的选择吗?

+3

似乎完全合理的,我。 –

+0

什么是神话代码? – James

+0

@詹姆斯:这就像那个老式的卡通,在黑板上有一堆可怕的方程,然后是“接下来会发生奇迹”,然后是期望的最终方程。 –

回答

0

一个更多钞票的解决方案(但肯定它是不是最好的):

(1:length(x))[-which((x-y)==0)] 
+0

这有几个优点(例如,它不适用于角色矢量),但除此之外:如果原始矢量和新矢量在某个点上都保留“NA”,这将标记为不同点(我已编辑我的原始问题以在示例中包含此内容)。不过,谢谢你的努力。 –

6

如何循环使用identical

!mapply(identical,x,y) 
[1] FALSE TRUE TRUE FALSE TRUE FALSE 

而对于位置:

seq_along(x)[!mapply(identical,x,y)] 
[1] 2 3 5 

which(!mapply(identical,x,y)) 
[1] 2 3 5 
+0

投票背后的任何基本原理? – James

+0

有趣的,但可能是矫枉过正,因为它会检查名称和其他属性的差异。 (Downvote不是我!) –

+0

@RichieCotton好点,认为选项可以很好地调整这种行为,但它似乎只是使它更严格。 – James