在R中对比两个DataFrame并高亮差异单元格
在R中对比DataFrame并高亮差异单元格
1. 准备示例数据
先还原你提到的测试数据,方便后续演示:
library(dplyr) library(gt) library(purrr) # 示例数据集 ex1_df <- tibble( id = 1:5, drug = c(2, 5, 7, 9, 11), dose = c(10, 20, 30, 40, 50) ) ex2_df <- tibble( id = 1:5, drug = c(2, 3, 7, 8, 10), dose = c(10, 20, 30, 40, 50) )
2. 定位差异单元格
首先生成一个标记矩阵,用来记录两个DataFrame中每个单元格是否存在差异:
# 生成差异标记:TRUE表示对应位置和ex2_df有差异 diff_markers <- ex1_df %>% mutate(across(everything(), ~ .x != ex2_df[[cur_column()]]))
3. 用gt包精准高亮差异单元格
通过tab_style结合差异标记,只对有差异的单元格应用高亮样式:
ex1_df %>% gt() %>% # 遍历每一列,针对差异单元格设置高亮 walk( .x = colnames(ex1_df), .f = function(col) { tab_style( # 自定义高亮样式:浅红色填充 style = cell_fill(color = "#ffcccc"), locations = cells_body( columns = all_of(col), # 只选择当前列中标记为差异的行 rows = diff_markers[[col]] ) ) } )
运行后,ex1_df中drug列的5、9、11这三个单元格会被精准高亮,其他无差异的单元格保持原样。
4. 额外处理:行顺序不一致的情况
如果两个DataFrame的行顺序不匹配,先按主键(比如id)对齐后再对比:
# 按id对齐行顺序 ex1_aligned <- ex1_df %>% arrange(id) ex2_aligned <- ex2_df %>% arrange(id) # 重新生成差异标记 diff_markers_aligned <- ex1_aligned %>% mutate(across(everything(), ~ .x != ex2_aligned[[cur_column()]]))
内容的提问来源于stack exchange,提问作者samthecodegod
相关产品推荐
相关产品推荐

