为什么这两个R对象不相同?

时间:2015-10-11 22:39:36

标签: 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

1 个答案:

答案 0 :(得分:4)

tl; dr 非同一性的来源确实存在于相关环境的差异,对象组件的@formula个插槽以及{{1 terms个广告位的属性。正如@ThomasK在上面的评论中指出的那样,对于大多数比较目的,@data已经足够/首选......

公式相同但不相同:

all.equal()

环境不同:

identical(x$a1@formula,y$a1@formula)
## [1] FALSE
all.equal(x$a1@formula,y$a1@formula)
## TRUE

将环境设置为相同会使公式相同:

environment(x$a1@formula)
## <environment: 0x9a408dc>
environment(y$a1@formula)
## <environment: 0x9564aa4>

然而,还有更多不同的东西:environment(x$a1@formula) <- .GlobalEnv environment(y$a1@formula) <- .GlobalEnv identical(x$a1@formula,y$a1@formula) ## TRUE 仍然是假的。

挖掘更多:

identical(x$a1,y$a1)

深入挖掘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 <- x$a1@data dy <- y$a1@data environment(attr(dx,"terms")) ## <environment: 0x9a408dc> environment(attr(dy,"terms")) ## <environment: 0x9564aa4> x$a1之间的相同,但我还没有经过测试。