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

