使用arsenal包comparedf对比数据框后,Excel导出值缺失问题
问题:使用arsenal包comparedf导出差异表到Excel后数值变为NA
问题场景
基于两个数据框构建对比报告,使用arsenal包的comparedf函数生成差异表,代码示例如下:
df1 <- data.frame(id = c("a", "b", "c", "d","e"), var = c(1, 2, 3, 4, 5), var2 = c(1,2,3,4,5)) df2 <- data.frame(id = c("a", "b", "c", "d","e"), var =c(1,3,4,2,5), var2 = c(1,2,4,3,5))
通过summary(comparedf(df1, df2, by="id"))生成差异结果后,尝试捕获差异表并导出至Excel:
vec1 <- summary(comparedf(df1, df2, by="id")) diftable <- as.data.frame(vec1$diffs.table) library(writexl) write_xlsx(diftable, "example.xlsx")
但导出后的Excel文件中,原本的数值全部变为NA。
原因分析
comparedf的summary输出里的diffs.table并非标准数据框,而是带有格式化属性的特殊表格对象,其中的数值列属于formattable类,包含额外的格式标记。- 使用
as.data.frame()转换时,这些带格式的数值无法被正确解析为普通数值类型;writexl仅支持标准数据类型(如numeric、character等),无法识别这类特殊格式的列,最终导出时就会显示为NA。
解决方法
方法1:强制转换特殊列为普通数值类型
先将diffs.table中的数值列强制转换为标准numeric类型,再导出:
vec1 <- summary(comparedf(df1, df2, by="id")) diftable <- as.data.frame(vec1$diffs.table) # 将带格式的数值列转换为普通numeric diftable$value.x <- as.numeric(as.character(diftable$value.x)) diftable$value.y <- as.numeric(as.character(diftable$value.y)) library(writexl) write_xlsx(diftable, "example.xlsx")
方法2:使用arsenal自带的导出函数
arsenal包提供了write2xlsx函数,可直接导出summary结果,避免类型转换问题:
library(arsenal) # 先生成comparedf对象 comp_obj <- comparedf(df1, df2, by="id") # 直接导出summary结果到Excel write2xlsx(summary(comp_obj), "example.xlsx")
内容的提问来源于stack exchange,提问作者Victor Shin
相关产品推荐
相关产品推荐

