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

在R语言中依据category列值拆分生成对应多列并填充匹配值

在R中拆分列并按值匹配生成对应新列

针对你需要将category列按逗号拆分,根据子串值填入category1/category2/category3列(无对应值填NA)的需求,这里提供两种可行的实现方法:

方法一:使用tidyverse工具链(推荐)

借助tidyr包的行拆分和宽表转换功能,代码更简洁易读:

library(tidyverse)

# 初始数据
df <- data.frame(category=c('1, 2', '1, 3','3', '2, 3'),
                 othercolumn= c("Grealish", "Saka", "Henry", 'Jesus'))

# 处理流程
finaldf <- df %>%
  # 添加行号确保合并后行顺序不变
  mutate(row_id = row_number()) %>%
  # 将category拆分至多行,分隔符为", "
  separate_rows(category, sep = ", ") %>%
  # 根据子串生成目标列名
  mutate(col_name = paste0("category", category)) %>%
  # 行转列,缺失值自动填充NA
  pivot_wider(id_cols = row_id, names_from = col_name, values_from = category) %>%
  # 合并回原数据
  left_join(df %>% mutate(row_id = row_number()), by = "row_id") %>%
  # 移除辅助行号并调整列顺序
  select(-row_id) %>%
  select(category, category1, category2, category3, othercolumn)

# 输出结果
finaldf

方法二:Base R实现

如果不想加载额外包,可以用基础循环实现:

# 初始数据(注意设置stringsAsFactors = FALSE避免因子问题)
df <- data.frame(category=c('1, 2', '1, 3','3', '2, 3'),
                 othercolumn= c("Grealish", "Saka", "Henry", 'Jesus'),
                 stringsAsFactors = FALSE)

# 初始化三个新列为NA
df$category1 <- NA_character_
df$category2 <- NA_character_
df$category3 <- NA_character_

# 逐行处理
for (i in seq_len(nrow(df))) {
  # 拆分当前行的category值
  current_cats <- strsplit(df$category[i], ", ")[[1]]
  # 遍历拆分后的子串,赋值到对应列
  for (cat in current_cats) {
    target_col <- paste0("category", cat)
    df[i, target_col] <- cat
  }
}

# 调整列顺序匹配目标格式
finaldf <- df[, c("category", "category1", "category2", "category3", "othercolumn")]

# 输出结果
finaldf

两种方法运行后都会得到你需要的目标数据框,其中tidyverse方法更适合处理大规模数据或后续需要链式操作的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:38