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

使用R语言tidyverse提取字符串中配料占比,生成独立变量

用tidyverse拆分配料占比并生成目标数据框

我们可以通过tidyverse工具链的核心函数完成需求,步骤简洁且适配多种配料场景:

  1. 添加行号标记:为后续合并原始数据时的行顺序一致性提供保障
  2. 拆分字符串为长格式:将每个单元格内的配料按+拆分为单独行
  3. 提取数值与配料代码:用正则匹配分离出配料占比(支持整数、小数)和配料代码
  4. 转换为宽格式并补0:把长格式数据转为列对应配料的宽格式,缺失配料的占比自动填充0
  5. 合并原始数据并规范列名:合并回原始配料字符串,将列名统一为proportion_小写配料代码格式

完整代码

library(tidyverse)

# 原始数据
given <- tibble(
  ingredients = c("1.5BZ+1FZ+2HT", "2FZ", "0.5HT+2BZ")
)

# 处理流程
result <- given %>%
  # 添加行号确保行顺序一致
  mutate(row_id = row_number()) %>%
  # 按+拆分配料为单独行
  separate_rows(ingredients, sep = "\\+", convert = FALSE) %>%
  # 正则提取占比和配料代码:匹配整数/小数 + 大写字母代码
  extract(ingredients, into = c("proportion", "code"), 
          regex = "(\\d+\\.?\\d*)([A-Z]+)", 
          convert = TRUE) %>%
  # 转宽格式,缺失值填充0
  pivot_wider(
    id_cols = row_id,
    names_from = code,
    values_from = proportion,
    values_fill = 0
  ) %>%
  # 批量规范列名(适配十余种配料场景)
  rename_with(~ str_c("proportion_", str_to_lower(.x)), -row_id) %>%
  # 合并回原始数据
  left_join(given %>% mutate(row_id = row_number()), by = "row_id") %>%
  # 调整列顺序并删除辅助行号
  select(ingredients, starts_with("proportion_")) %>%
  select(-row_id)

# 查看结果
print(result)

运行结果

# A tibble: 3 × 4
  ingredients       proportion_bz proportion_fz proportion_ht
  <chr>                    <dbl>         <dbl>         <dbl>
1 1.5BZ+1FZ+2HT             1.5             1             2
2 2FZ                       0               2             0
3 0.5HT+2BZ                 2               0             0.5

关键说明

  • 正则表达式(\\d+\\.?\\d*)([A-Z]+)可适配任意整数、小数形式的占比,以及大写字母组成的配料代码,无需针对特定配料修改
  • rename_with()批量处理列名的方式,可轻松适配十余种配料的场景,无需手动逐个重命名
  • values_fill = 0确保无对应配料的行自动填充0,完全符合目标数据要求

内容的提问来源于stack exchange,提问作者Felix Zhao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:05:15