2015-10-11 16 views
1

我在读这本书的数据挖掘与R'和跨越这些代码来:为什么这两个R对象不一样?

library(DMwR) 

clean.algae <- knnImputation(algae, k = 10) 
x <- sapply(names(clean.algae)[12:18], 
      function(x,names.attrs) { 
       f <- as.formula(paste(x,"~ .")) 
       dataset(f,clean.algae[,c(names.attrs,x)],x) 
      }, 
      names(clean.algae)[1:11]) 

我想x可以改写为:

y <- sapply(names(clean.algae)[12:18], 
      function(x) { 
       f <- as.formula(paste(x,"~ .")) 
       dataset(f,clean.algae[,c(names(clean.algae)[1:11],x)],x) 
      } 
) 

然而,identical(x,y)回报FALSE

我决定调查为什么把我的注意力仅限于这些列表的第一个元素。

我发现:

identical(attributes(x[[1]])$data, 
      attributes(y[[1]])$data) 
[1] FALSE 

然而:

which(!(attributes(x[[1]])$data == attributes(y[[1]])$data)) 
integer(0) 

这对我来说意味着在数据帧中的所有元素是相等的,因此,两个数据帧必须相同。为什么不是这种情况?

我也有对象的公式属性类似的问题:

> identical(attributes(x[[1]])$formula, 
+   attributes(y[[1]])$formula) 
[1] FALSE 
> 
> attributes(x[[1]])$formula == attributes(y[[1]])$formula 
[1] TRUE 
+2

看看'相同'和'all.equal' [这里]之间的区别(http://stackoverflow.com/questions/3395696/difference-in-r-between-identicalx-y-and-istrueall -equalx-y)并阅读“比较”。 –

+0

不可重现;我们如何构建'clean.algae'?有一点要记住的是,“相同”大概是关注环境,而“all.equal”不会(我认为)。 –

+0

@BenBolker我道歉。我更新了代码片段以使其可重现。数据框与环境没有任何关系。你能澄清一下吗? – mauna

回答

4

TL;博士非同一性的源确实是在相关联的环境中的差异,两种成分的@formula槽的对象,以及@data插槽的terms属性。作为@ThomasK在评论中指出的上述,对于大多数比较的目的all.equal()是不够好/首选...

公式是相等的,但不完全相同:

identical([email protected],[email protected]) 
## [1] FALSE 
all.equal([email protected],[email protected]) 
## TRUE 

环境不同:

environment([email protected]) 
## <environment: 0x9a408dc> 
environment([email protected]) 
## <environment: 0x9564aa4> 

将环境设置为相同使得公式完全相同:

environment([email protected]) <- .GlobalEnv 
environment([email protected]) <- .GlobalEnv 
identical([email protected],[email protected]) 
## TRUE 

但是,还有更多不同的东西:identical(x$a1,y$a1)仍然是FALSE。

挖些:

for (i in slotNames(x$a1)) { 
    print(i) 
    print(identical(slot(x$a1,i),slot(y$a1,i))) 
} 
## [1] "data" 
## [1] FALSE 
## [1] "name" 
## [1] TRUE 
## [1] "formula" 
## [1] TRUE 

挖掘更深的data卡插槽(同时,如果使用得当的str())发现更多的环境 - 的条款(密切相关的公式)这段时间有关:

dx <- [email protected] 
dy <- [email protected] 
environment(attr(dx,"terms")) 
## <environment: 0x9a408dc> 
environment(attr(dy,"terms")) 
## <environment: 0x9564aa4> 

将这些设置为彼此相等应导致x$a1y$a1之间的相同性,但我没有测试过。

相关问题