我正在阅读“使用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
答案 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
之间的相同,但我还没有经过测试。