如何在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
相关产品推荐
相关产品推荐

