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

如何在R中对比数据框列序列与参考序列并定位差异?

R语言实现行与参考向量的差异对比

原始数据

首先定义示例数据框和参考向量:

df <- data.frame(id = c(1:5),
                 var1 = c("A","A","A","A","B"),
                 var2 = c(10,20,10,10,10),
                 var3 = c("A2", "A2", "A3", "A2", "A2"),
                 var4 = c("B2", "B2", "B2", "B3", "B2"),
                 var5 = c("C2", "C2", "C2", "C2", "C4"))

ref <- c("A", 10, "A2", "B2", "C2")

方法1:基础R实现

通过apply逐行对比,提取差异值和对应列名:

# 提取需要对比的var1至var5列
compare_cols <- df[, paste0("var", 1:5)]

# 逐行找出与参考向量不同的位置
diff_pos <- apply(compare_cols, 1, function(x) which(x != ref))

# 生成diff列(存储差异值)和which列(存储差异列名)
df$diff <- mapply(function(row, pos) if(length(pos)==0) NA else row[pos], 
                  split(compare_cols, seq(nrow(compare_cols))), diff_pos)
df$which <- sapply(diff_pos, function(pos) if(length(pos)==0) NA else colnames(compare_cols)[pos])

# 提取最终需要的列
result <- df[, c("id", "diff", "which")]
print(result)

方法2:tidyverse工具包实现

用dplyr的行处理功能结合purrr完成:

library(dplyr)
library(purrr)

result <- df %>%
  rowwise() %>%
  mutate(
    # 把当前行的var1-var5转为向量,对比ref找出差异位置
    diff_val = {
      row_vec = c(var1, var2, var3, var4, var5)
      diff_idx = which(row_vec != ref)
      if(length(diff_idx) == 0) NA else row_vec[diff_idx]
    },
    which_col = {
      row_vec = c(var1, var2, var3, var4, var5)
      diff_idx = which(row_vec != ref)
      if(length(diff_idx) == 0) NA else paste0("var", diff_idx)
    }
  ) %>%
  ungroup() %>%
  select(id, diff = diff_val, which = which_col)

print(result)

说明

上述代码假设每行仅有一个差异值(与示例数据情况匹配),如果存在多行多差异的场景,可将row_vec[diff_idx]改为paste(row_vec[diff_idx], collapse = ", "),paste0("var", diff_idx)改为paste(paste0("var", diff_idx), collapse = ", "),实现多差异值的合并展示。

内容的提问来源于stack exchange,提问作者ecl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:39:31