使用R语言tidyverse提取字符串中配料占比,生成独立变量
用tidyverse拆分配料占比并生成目标数据框
我们可以通过tidyverse工具链的核心函数完成需求,步骤简洁且适配多种配料场景:
- 添加行号标记:为后续合并原始数据时的行顺序一致性提供保障
- 拆分字符串为长格式:将每个单元格内的配料按
+拆分为单独行 - 提取数值与配料代码:用正则匹配分离出配料占比(支持整数、小数)和配料代码
- 转换为宽格式并补0:把长格式数据转为列对应配料的宽格式,缺失配料的占比自动填充0
- 合并原始数据并规范列名:合并回原始配料字符串,将列名统一为
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
相关产品推荐
相关产品推荐

