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

R语言如何将带分隔符的字符串列拆分为多个虚拟变量列

R实现拆分年份列生成虚拟变量

方法1:tidyverse 实现(推荐,语法简洁易读)

需要提前安装加载dplyr和tidyr包,或者直接加载tidyverse套件:

library(tidyverse)

# 构造原始数据
id <- c(1,2,3,4)
medal <- c("2021-2020-2018","NA","2019","2015-2014-2012") 
df <- data.frame(id, medal)

df_result <- df %>%
  # 按短横线拆分medal字段,转换为长表结构
  separate_rows(medal, sep = "-", convert = TRUE) %>%
  # 标记存在的年份为1,过滤字符串形式的"NA"
  mutate(value = ifelse(medal == "NA", NA, 1)) %>%
  # 转换为宽表,不存在的年份默认填充0
  pivot_wider(names_from = medal, values_from = value, values_fill = 0) %>%
  # 关联回原始medal列,保证输出结构和需求一致
  left_join(df %>% select(id, medal), by = "id") %>%
  # 调整列顺序和你期望的输出一致
  select(id, medal, `2021`, `2020`, `2019`, `2018`, `2015`, `2014`, `2012`)

注意:如果你的数据中NA是R原生的缺失值而非字符串,只需要把ifelse(medal == "NA")改为ifelse(is.na(medal))即可。

方法2:Base R 实现(无需安装额外包)

# 构造原始数据
id <- c(1,2,3,4)
medal <- c("2021-2020-2018","NA","2019","2015-2014-2012") 
df <- data.frame(id, medal)

# 提取所有出现的有效年份并按降序排序
all_years <- unique(unlist(strsplit(df$medal, "-")))
all_years <- sort(as.numeric(all_years[all_years != "NA"]), decreasing = TRUE)

# 逐行生成年份虚拟变量矩阵
dummy_mat <- t(apply(df, 1, function(row) {
  curr_years <- strsplit(row["medal"], "-")[[1]]
  as.integer(all_years %in% curr_years)
}))
colnames(dummy_mat) <- as.character(all_years)

# 合并虚拟变量和原始数据得到结果
df_result <- cbind(df, dummy_mat)

两种方法最终输出的df_result都和你给出的期望效果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:36:02