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

如何在R语言中合并DataFrame中存在重复元素的列?

需求实现方案

需求说明

对DataFrame按以下规则处理:

  • 若多列存在至少一行取值相同(非NA),则将这些列合并为一列,列名用|连接原列名;
  • 合并后的单元格值为该行对应列的去重结果,多个值用|分隔;
  • 若对应行的所有值均为NA,则保留NA。

实现代码(R语言)

使用tidyverse和igraph包实现,步骤如下:

1. 加载依赖包

library(tidyverse)
library(igraph)

2. 定义核心函数

# 1. 找出需要合并的列分组:存在至少一行取值相同的列归为一组
find_column_groups <- function(df) {
  # 构建列相似矩阵:两列存在至少一行取值相同则标记为TRUE
  sim_mat <- outer(colnames(df), colnames(df), function(x, y) {
    any(df[[x]] == df[[y]], na.rm = TRUE)
  })
  # 将矩阵转换为图,找出连通分量(即列分组)
  graph <- graph_from_adjacency_matrix(sim_mat, mode = "undirected", diag = FALSE)
  groups <- components(graph)$membership
  # 按分组整理列名
  split(names(groups), groups)
}

# 2. 处理单个列分组:合并列并对每行去重
process_group <- function(df, group_cols) {
  df %>%
    select(all_of(group_cols)) %>%
    rowwise() %>%
    mutate(merged = paste(unique(na.omit(c_across())), collapse = "|")) %>%
    pull(merged) %>%
    # 空字符串转换为NA
    na_if("")
}

# 3. 主函数:整合所有步骤
merge_duplicate_columns <- function(df) {
  col_groups <- find_column_groups(df)
  map_dfc(col_groups, ~process_group(df, .x)) %>%
    rename_with(~paste(.x, collapse = "|"))
}

3. 验证示例

示例1处理

# 加载示例1数据
df1 <- structure(list(COL1 = c("Sp1-2", "Sp5-1", "Sp_7-3"), COL2 = c("Sp1-2", 
"Sp5-2", "Sp_7-3"), COL3 = c("Sp3_2-54", "Sp2-4", NA), COL4 = c("Sp3-2", 
"Sp9-2", "SP6-56"), COL5 = c("Sp3-2", "Sp10-3", "Sp2-7"), COL6 = c("Sp3-2", 
"SP9-90", "SP3-3"), COL7 = c("SP9-43", NA, NA)), class = "data.frame", row.names = c(NA, 
-3L))

# 执行合并
merge_duplicate_columns(df1)

输出结果:

# A tibble: 3 × 4
  `COL1|COL2`   COL3      `COL4|COL5|COL6`       COL7  
  <chr>         <chr>     <chr>                  <chr> 
1 Sp1-2         Sp3_2-54  Sp3-2                  SP9-43
2 Sp5-1|Sp5-2   Sp2-4     Sp9-2|Sp10-3|SP9-90    NA    
3 Sp_7-3        NA        SP6-56|Sp2-7|SP3-3     NA    

示例2处理

# 加载示例2数据
dat <- structure(list(G136 = c(NA, NA, "SP4-140", "SP2-8", "SP3-59",  "SP1_contig.682-8", NA, NA, NA), G348 = c(NA, NA, "SP4-140",  NA, NA, NA, NA, NA, NA), G465 = c(NA, NA, NA, NA, NA, "SP1_contig.682-8",  NA, NA, NA)), row.names = c(NA, -9L), class = c("tbl_df", "tbl",  "data.frame"))

# 执行合并
merge_duplicate_columns(dat)

输出结果:

# A tibble: 9 × 1
  `G136|G348|G465`
  <chr>            
1 NA               
2 NA               
3 SP4-140          
4 SP2-8            
5 SP3-59           
6 SP1_contig.682-8 
7 NA               
8 NA               
9 NA               

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:45:32