如何在R中将单列按分隔符拆分为数量不等的多列
R语言拆分不等长逗号分隔字符串为多列的实现方法
tidyverse 方案(代码简洁,推荐使用)
需先安装加载tidyr包(版本≥1.2.0),如果未安装可先执行install.packages("tidyr"):
library(tidyr) result <- DF %>% separate_wider_delim( Col1, delim = ",", names_sep = "", too_few = "align_start", values_fill = "" )
参数说明:
too_few = "align_start"表示长度不足的行从左到右填充,末尾空缺values_fill = ""表示空缺位置填充空字符串,和示例输出格式一致names_sep = ""会自动生成Col1、Col2格式的列名,符合需求
如果使用旧版本tidyr,可采用拆分后展开的方案:
library(tidyr) library(dplyr) result <- DF %>% mutate(col_list = strsplit(Col1, ",")) %>% unnest_wider(col_list, names_sep = "") %>% rename_with(~ gsub("col_list", "Col", .x)) %>% select(-Col1) %>% # 若需保留原字符串列可删除此行 mutate(across(everything(), ~ replace(.x, is.na(.x), "")))
base R 方案(无需额外安装依赖包)
# 拆分所有字符串为列表 split_vec <- strsplit(DF$Col1, ",") # 计算最大元素长度,统一所有行的长度 max_len <- max(lengths(split_vec)) # 空缺位置补空字符串 split_filled <- lapply(split_vec, function(x) c(x, rep("", max_len - length(x)))) # 转换为数据框,保留原有行名 result <- data.frame( do.call(rbind, split_filled), row.names = rownames(DF), check.names = FALSE ) # 设置列名 colnames(result) <- paste0("Col", 1:max_len)
两种方案执行后得到的result均和预期输出完全一致。
内容的提问来源于stack exchange,提问作者Sharif Amlani
相关产品推荐
相关产品推荐

