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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 01:43:27