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_name | taxon_annotation |
|---|---|
| 1. Neodiprion virginianus | species, hymenopterans |
| 2. Nepsalus jezoensis | species, insects |
| 3. Prochas sp. 2 YYH-2022a | species, 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
相关产品推荐
相关产品推荐

