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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:15:03