R语言中移除字符串内重复值并拆分列的方法求助
解决方案
方法1:先去重再拆分(适合已知最大列数)
使用tidyverse工具链,先对每行的逗号分隔字符串去重,再拆分到指定列:
library(tidyverse) # 构造示例数据 df <- tibble( ID = 1:4, `Column A` = c("A", "B,C", "D,D,E", "A,D") ) # 处理流程 df_clean <- df %>% # 拆分字符串为列表,去重后重新合并为逗号分隔的字符串 mutate(`Column A` = map_chr(str_split(`Column A`, ","), ~ str_c(unique(.x), collapse = ","))) %>% # 拆分到两列,右侧不足补NA separate(`Column A`, into = c("Column A", "Column B"), sep = ",", fill = "right") print(df_clean)
输出结果:
# A tibble: 4 × 3 ID `Column A` `Column B` <int> <chr> <chr> 1 1 A NA 2 2 B C 3 3 D E 4 4 A D
方法2:行转列后去重再宽表转换(适合元素数量不固定)
如果后续可能出现更多唯一值,这种方法会自动生成对应列:
df_clean <- df %>% # 将逗号分隔的字符串拆分为多行 separate_rows(`Column A`, sep = ",") %>% # 按ID和Column A去重,保留唯一组合 distinct(ID, `Column A`, .keep_all = TRUE) %>% # 分组后为每个唯一值分配列名 group_by(ID) %>% mutate(col = paste0("Column ", LETTERS[row_number()])) %>% # 转换为宽表格式 pivot_wider(names_from = col, values_from = `Column A`) %>% ungroup() print(df_clean)
基础R实现
如果不想用tidyverse,也可以用基础R函数完成:
# 构造示例数据 df <- data.frame( ID = 1:4, `Column A` = c("A", "B,C", "D,D,E", "A,D"), stringsAsFactors = FALSE ) # 对每行字符串去重 df$`Column A` <- sapply(strsplit(df$`Column A`, ","), function(x) paste(unique(x), collapse = ",")) # 拆分到多列 df_clean <- read.table(text = paste(df$ID, df$`Column A`), sep = " ", fill = TRUE, col.names = c("ID", "Column A", "Column B"), stringsAsFactors = FALSE) print(df_clean)
内容的提问来源于stack exchange,提问作者O Stanley
相关产品推荐
相关产品推荐

