2015-10-11 15 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之間的相同性,但我沒有測試過。

相關問題