You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:57:14