R语言拆分化学分子式为元素组分:缺失元素与无数字元素处理
解决R语言拆分化学分子式并生成元素计数表格的问题
实现思路
先通过正则表达式提取分子式中的元素及对应数量(无数字标注的元素默认计1),再与指定元素列表匹配,缺失元素填充0,最终生成标准化计数表格。
具体步骤
- 加载依赖包:使用
tidyverse工具集(包含stringr用于字符串处理,dplyr用于数据整理)
# 若未安装先执行安装 # install.packages("tidyverse") library(tidyverse)
- 定义目标元素与解析函数
指定需要统计的元素列表,编写函数处理单个分子式:
# 目标元素列表 target_elements <- c("C", "H", "O", "N", "P", "S") # 解析单个分子式的函数 parse_formula <- function(formula_str) { # 提取元素(大写开头)和后续数字(允许空值) elem_matches <- str_extract_all(formula_str, "([A-Z])(\\d*)", simplify = TRUE) # 转换为数据框,空数字替换为1 elem_df <- data.frame( Element = elem_matches[, 1], Count = ifelse(elem_matches[, 2] == "", 1, as.integer(elem_matches[, 2])), stringsAsFactors = FALSE ) # 匹配目标元素,缺失元素填充0,转宽格式输出 data.frame(Element = target_elements, stringsAsFactors = FALSE) %>% left_join(elem_df, by = "Element") %>% mutate(Count = replace_na(Count, 0)) %>% pivot_wider(names_from = Element, values_from = Count) }
- 测试单个分子式
# 测试示例分子式 parse_formula("C6H12ON2PS")
输出结果:
# A tibble: 1 × 6 C H O N P S <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 6 12 1 2 1 1
- 批量处理多个分子式
# 批量处理示例 formula_list <- c("C6H12ON2PS", "H2O", "C6H6", "NH3") map_dfr(formula_list, parse_formula)
输出结果:
# A tibble: 4 × 6 C H O N P S <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 6 12 1 2 1 1 2 0 2 1 0 0 0 3 6 6 0 0 0 0 4 0 3 0 1 0 0
原代码问题说明
你之前使用的str_split(strsplit(as.character(Form), '(?<=.)(?=[A-Z])', perl=TRUE))仅完成了分子式的初步拆分(如将C6H12ON2PS拆分为["C6", "H12", "O", "N2", "P", "S"]),但缺少提取元素与数字对应关系、补全缺失元素并填充0的关键步骤,因此无法处理元素缺失的场景。
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

