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

R语言中如何将数据框单个列拆分为两个列

R语言单列分类学数据框拆分两列实现方案

你的原始数据存在明确配对规律:带数字序号开头的行是分类单元名称,开头带空格缩进的行是对应分类单元的阶元/类群注释,其中第一个分类单元的名称存储在数据框列名中,其余分类单元和注释按「名称-注释」交替排列。

基础R实现(无依赖包)

直接运行以下代码即可输出两列结构的结果:

# 从列名提取第一个分类单元名称
first_taxon <- gsub("^X(\\d+)\\.\\.", "\\1. ", colnames(taxonomy))
first_taxon <- gsub("\\.", " ", first_taxon)

# 提取所有行内存储的分类单元(匹配数字+点号开头的行)
taxon_rows <- grep("^\\d+\\.", taxonomy[[1]], value = TRUE)
taxon_names <- c(first_taxon, taxon_rows)

# 提取所有缩进的注释行,去除前后多余空白
taxon_anno <- grep("^\\s+", taxonomy[[1]], value = TRUE)
taxon_anno <- trimws(taxon_anno)

# 长度对齐:处理截取前N行时末尾分类单元缺失注释的情况
if(length(taxon_anno) < length(taxon_names)){
  taxon_anno <- c(taxon_anno, rep(NA, length(taxon_names) - length(taxon_anno)))
}

# 合并为标准两列数据框
result <- data.frame(
  taxon_name = taxon_names,
  taxon_annotation = taxon_anno
)

运行后前几行输出结构如下:

taxon_nametaxon_annotation
1. Neodiprion virginianusspecies, hymenopterans
2. Nepsalus jezoensisspecies, insects
3. Prochas sp. 2 YYH-2022aspecies, wasps, ants & bees
......

tidyverse实现

如果习惯使用tidyverse生态的函数,可以用以下代码实现相同效果:

library(dplyr)
library(tidyr)

result <- taxonomy %>%
  # 补入列名中存储的第一个分类单元
  add_row(
    !!colnames(.) := gsub("^X(\\d+)\\.\\.(.*)", "\\1. \\2", colnames(.)) %>% gsub("\\.", " ", .),
    .before = 1
  ) %>%
  # 为配对的名称、注释打分组标记
  mutate(
    row_type = ifelse(grepl("^\\d+\\.", .[[1]]), "taxon_name", "taxon_annotation"),
    pair_id = cumsum(row_type == "taxon_name"),
    across(1, trimws)
  ) %>%
  # 长宽转换拆分为两列
  pivot_wider(
    id_cols = pair_id,
    names_from = row_type,
    values_from = 1
  ) %>%
  select(-pair_id)

说明

只要数据保持「分类单元行以数字序号开头、注释行以空白缩进开头」的配对规则,上述代码可以兼容不同长度的完整数据集,不需要手动指定行位置。如果存在注释格式不统一的情况,只需要调整grep匹配规则即可。


内容的提问来源于stack exchange,提问作者Pedro Alexander Velasquez Vasc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:18:22