如何忽略spec_tbl_df的problems属性测试tibble数据相等性?
如何判断仅因
spec_tbl_df空problems指针不同的tibble是否相等? 当你用readr::read_csv()读取同一文件得到两个tibble时,即使数据内容完全一致,identical()也可能返回FALSE——原因在于tibble的spec_tbl_df子类中,空的problems属性是不同的对象(指针不同),但对你而言它们本质是相同的。以下是几种可行的解决方法:
方法1:方括号子集化移除spec_tbl_df的额外属性
通过tibble[]的方式可以移除tibble的spec_tbl_df子类属性,只保留基础的tibble结构,此时再用identical()就能正确判断数据是否一致:
library(tidyverse) # 生成测试文件 tibble(x = 1:3) %>% write_csv(file = '~/Documents/demo.csv') # 读取两次得到tibble d1.tb <- read_csv(file = '~/Documents/demo.csv') d2.tb <- read_csv(file = '~/Documents/demo.csv') # 子集化后判断相等性 identical(d1.tb[], d2.tb[]) # [1] TRUE
方法2:用all.equal()替代identical()
identical()会严格比较所有属性(包括对象指针),而all.equal()默认会忽略这类非核心的属性差异,只比较数据的内容、结构和类型,直接就能得到正确结果:
all.equal(d1.tb, d2.tb) # [1] TRUE
方法3:手动统一problems属性
如果你一定要用identical(),可以手动将两个tibble的problems属性设为同一个值(比如空对象或者相同的自定义值),这样指针就会一致:
# 复制原tibble d1.1.tb <- d1.tb d2.1.tb <- d2.tb # 统一problems属性 attributes(d1.1.tb)$problems <- attributes(d2.tb)$problems # 或者设为空:attributes(d1.1.tb)$problems <- tibble() # 再用identical判断 identical(d1.1.tb, d2.1.tb) # [1] TRUE
验证差异来源
你可以通过以下代码确认两个tibble仅在problems属性的指针上存在差异:
# 整体属性不同 identical(attributes(d1.tb), attributes(d2.tb)) # [1] FALSE # 但problems的内容都是空的tibble problems(d1.tb) # A tibble: 0 × 5 # … with 5 variables: row <int>, col <int>, expected <chr>, actual <chr>, file <chr> problems(d2.tb) # A tibble: 0 × 5 # … with 5 variables: row <int>, col <int>, expected <chr>, actual <chr>, file <chr> # 只是problems的指针不同 identical(attributes(d1.tb)$problems, attributes(d2.tb)$problems) # [1] FALSE
内容的提问来源于stack exchange,提问作者uqbfitzpatrick
相关产品推荐
相关产品推荐

