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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 06:20:44