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

