【发布时间】:2023-02-11 04:48:57
【问题描述】:
我有两个大约 150 行的数据帧 X 和 Y,其中 identical(X, Y) 是 TRUE 但 identical(digest(X), digest(Y)) 是 FALSE。
我确实看过 this answer 并重新运行了他们测试的内容,得到了类似的结果,但与他们的问题不同的是,我的数据帧的属性是相同的。测试结果:
> names(attributes(X))
[1] "names" "row.names" "class"
> names(attributes(Y))
[1] "names" "row.names" "class"
> digest(X)
[1] "07b7ef11ce6eaae01ddd79e4facef581"
> digest(Y)
[1] "09d8abcab0af0a72265a9b690f4eacc3"
> digest(X[1:nrow(X),])
[1] "2f338de9972529bd2bc9c39c3c5762ea"
> digest(Y[1:nrow(Y),])
[1] "2f338de9972529bd2bc9c39c3c5762ea"
> identical(X, Y, attrib.as.set=FALSE)
[1] TRUE
我还将数据帧保存为 .RDS 文件,并重新读取它们。
> X_rds <- read_rds("cache_vars/X.rds")
> Y_rds <- read_rds("cache_vars/Y.rds")
> identical(X_rds , Y_rds )
[2] TRUE
> digest(X_rds)
[2] "07b7ef11ce6eaae01ddd79e4facef581"
> digest(Y_rds )
[2] "09d8abcab0af0a72265a9b690f4eacc3"
> identical(X_rds , Y_rds , attrib.as.set=FALSE)
[2] TRUE
和其他海报一样,转换为矩阵并返回数据框产生了相同的摘要,所以这可能是一些结构性问题。
> X_Mat <- as.matrix(X_rds)
> Y_Mat <- as.matrix(Y_rds)
> identical(digest(X_Mat), digest(Y_Mat))
[2] TRUE
> X_DF <- as.data.frame(X_Mat)
> Y_DF <- as.data.frame(Y_Mat)
> identical(digest(X_DF ), digest(Y_DF))
[2] TRUE
Dataframe X 是从并行设计的循环中生成的(但带有 %do% 标志,因此没有完成实际的并行性),Y 是从顺序循环中生成的。
X 和 Y 的 .RDS 文件可以在 this link 找到。
【问题讨论】:
-
你的问题又是什么?
-
它们是如何创建的?仅供参考,
Xraw <- serialize(X, NULL)(和Yraw)后跟which(Xraw != Yraw)(对我而言)返回 9 个不同的字节。坦率地说,这并没有告诉我很多,因为我没有记住serialize的方法,也没有记住如何快速知道这些字节在data.frame的范围内是如何解释的。同样奇怪的是,serialize(X, NULL)的长度与Y的长度相同,而.rds文件的大小却不同。有趣的。也许您可以比较这两个框架是如何创建的(但我认为我不在这个内部讨论中,对我来说太沉重了:-)。