R语言从文本列拆分两类不同变量生成对应数据框的实现方法
R语言混合固定宽度字段拆分解决方案
依赖dplyr和stringr两个包实现,代码如下:
# 加载依赖 library(dplyr) library(stringr) # 构造示例数据 df <- data.frame( var1 = c('a','b','c'), var2 = c('d','e','f'), freqA = c(3,1,0), freqB = c(0,2,1), R1 = c('A1A2A3 ','A1Ba1Ba2 ','Ba1 ')) # 生成df_freqA max_A <- max(df$freqA) df_freqA <- df %>% select(var1, freqA, R1) %>% rowwise() %>% mutate( a_str = str_sub(str_trim(R1), 1, freqA * 2), a_list = list(str_extract_all(a_str, ".{2}")[[1]]), a_list = list(c(a_list, rep("", max_A - length(a_list)))) ) %>% ungroup() %>% unnest_wider(a_list, names_sep = "_") %>% rename_with(~paste0("R", seq_along(.)), starts_with("a_list_")) %>% select(var1, starts_with("R")) # 生成df_freqB max_B <- max(df$freqB) df_freqB <- df %>% select(var1, freqA, freqB, R1) %>% rowwise() %>% mutate( b_str = str_sub(str_trim(R1), freqA * 2 + 1, freqA * 2 + freqB * 3), b_list = list(str_extract_all(b_str, ".{3}")[[1]]), b_list = list(c(b_list, rep("", max_B - length(b_list)))) ) %>% ungroup() %>% unnest_wider(b_list, names_sep = "_") %>% rename_with(~paste0("R", seq_along(.)), starts_with("b_list_")) %>% select(var1, starts_with("R"))
关键逻辑说明
- 采用
rowwise()逐行处理,适配每行不同的freqA、freqB参数 - 先通过
str_trim()去掉R1字段末尾冗余空格,再按A类、B类的字符长度规则截取对应片段 - 用正则
.{n}直接按固定长度拆分字符串,无需手动计算位置偏移 - 拆分后补全空字符串到最大条目数,保证所有行维度一致,转宽表时不会缺列
报错原因说明
之前遇到的invalid 'times' argument报错,是因为未逐行处理时,rep()的times参数传入了长度不匹配的向量,逐行处理后参数为单个数值,即可解决该问题。
内容的提问来源于stack exchange,提问作者Benoit bbn
相关产品推荐
相关产品推荐

