如何使用R将长度不等的分号分隔字符串列拆分为多列
R拆分多分隔符字符串列为多列的实现方法
完全可以通过R实现该需求,以下提供两种常用的实现方案:
方案1:使用tidyverse系列包(推荐,代码简洁)
用到tidyr包的separate_wider_delim()函数,专门适配这种不等长分隔列拆分场景,代码如下:
# 加载包 library(tidyr) library(dplyr) # 构造示例数据 str <- as.character(c("M 12; M 13","M 24", NA, "C 12; C 50; C 78")) no <- seq(1:4) df <- data.frame(no,str) # 拆分列 df_split <- df %>% separate_wider_delim( cols = str, delim = "; ", # 指定分隔符为分号加空格 names_sep = "_", # 拆分后列名的分隔符,生成str_1、str_2、str_3 too_few = "align_start", # 不足最大列数的行用NA填充,值靠左对齐 too_many = "drop" # 超过预期列数的部分直接丢弃,也可以根据需求调整 )
运行后输出结果如下:
# A tibble: 4 × 4 no str_1 str_2 str_3 <int> <chr> <chr> <chr> 1 1 M 12 M 13 <NA> 2 2 M 24 <NA> <NA> 3 3 <NA> <NA> <NA> 4 4 C 12 C 50 C 78
方案2:基础R实现(无需安装第三方包)
如果不想依赖第三方包,可以用基础R的字符串处理函数实现:
# 构造示例数据 str <- as.character(c("M 12; M 13","M 24", NA, "C 12; C 50; C 78")) no <- seq(1:4) df <- data.frame(no,str) # 拆分字符串 split_list <- strsplit(df$str, "; ") # 统一列表内每个元素的长度为最大长度3,不足的补NA max_len <- max(sapply(split_list, length)) split_list_fill <- lapply(split_list, function(x) c(x, rep(NA, max_len - length(x)))) # 转成数据框合并到原数据 split_df <- do.call(rbind, split_list_fill) colnames(split_df) <- paste0("str_", 1:max_len) df_split <- cbind(df[, "no", drop=FALSE], split_df)
运行得到的结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者student_R123
相关产品推荐
相关产品推荐

