如何在R中汇总文本文件括号内数值并生成分类DataFrame
在R中处理分类文本并生成求和DataFrame
以下是针对你需求的分步解决方案,分两种方法:base R(无需额外安装包)和tidyverse(更简洁的现代R语法)。
方法一:Base R实现(无需额外包)
1. 读取文本文件
先把文本文件放在R的工作目录里(可用getwd()查看当前目录,setwd()切换目录),然后读取每一行内容:
# 读取文件,替换成你的文件实际路径 lines <- readLines("pathway.txt") # 若想先测试示例数据,可直接用下面的代码替代读取步骤 # lines <- c( # "Carbohydrate metabolism", # "00010 Glycolysis / Gluconeogenesis (27)", # "00020 Citrate cycle (TCA cycle) (22)", # "00030 Pentose phosphate pathway (19)", # "Energy metabolism", # "00190 Oxidative phosphorylation (68)", # "00710 Carbon fixation in photosynthetic organisms (16)", # "00720 Carbon fixation pathways in prokaryotes (10)" # )
2. 给每条条目分配对应分类
遍历每一行,遇到分类标题就记录下来,后续的条目自动归到该分类下:
# 创建空向量存储每行对应的分类 category <- character(length(lines)) current_category <- "" for (i in 1:length(lines)) { # 判断当前行是否为分类标题(开头不是数字) if (!grepl("^\\d", lines[i])) { current_category <- lines[i] } category[i] <- current_category }
3. 提取括号内的数值
筛选出条目行,用正则表达式提取括号里的数字并转换为数值类型:
# 筛选出所有条目行(以数字开头的行) item_rows <- lines[grepl("^\\d", lines)] item_categories <- category[grepl("^\\d", lines)] # 提取括号内的数字,去掉括号后转为整数 values <- as.integer(sub("\\(|\\)", "", regmatches(item_rows, regexpr("\\(\\d+\\)", item_rows))))
4. 按分类求和并生成目标DataFrame
# 按分类分组求和 sum_result <- aggregate(values ~ item_categories, data = data.frame(item_categories, values), sum) # 重命名列名为你需要的V1和V2 colnames(sum_result) <- c("V1", "V2") # 查看最终结果 print(sum_result)
运行后会得到你想要的DataFrame:
V1 V2 1 Carbohydrate metabolism 68 2 Energy metabolism 94
方法二:Tidyverse实现(更简洁)
如果后续经常处理数据,tidyverse包会让操作更高效,先安装并加载包:
install.packages("tidyverse") library(tidyverse)
用链式语法一步完成所有操作:
read_lines("pathway.txt") %>% # 将每行内容转为数据框的一列 enframe(name = NULL, value = "line") %>% # 标记哪些行是分类标题(不以数字开头) mutate(is_category = !str_detect(line, "^\\d")) %>% # 将分类标题向下填充到对应所有条目行 fill(category = ifelse(is_category, line, NA), .direction = "down") %>% # 只保留条目行 filter(!is_category) %>% # 提取括号内的数字并转为整数 mutate(value = as.integer(str_remove_all(str_extract(line, "\\(\\d+\\)"), "\\(|\\)"))) %>% # 按分类分组求和 group_by(category) %>% summarise(total = sum(value)) %>% # 重命名列 rename(V1 = category, V2 = total) %>% ungroup()
这个方法代码逻辑清晰,适合后续学习R数据处理的进阶用法。
内容的提问来源于stack exchange,提问作者Umar
相关产品推荐
相关产品推荐

