R语言如何将单列交替存储的数据拆分为x、y两列?
R语言单列交替存储数据拆分为两列结构化数据
问题规律说明
原始数据从有效内容行开始,按行交替存储两类信息:
- 奇数行:带数字编号前缀的物种名称
- 偶数行:对应上一行物种的类群属性
两类信息逐行配对,可通过位置索引直接拆分重组。
实现方案
方案1:基础R实现(无需安装额外依赖包)
# 1. 读入数据:如果是本地文件,可替换为 read.csv("你的文件路径.csv", stringsAsFactors = FALSE) # 以下为复现示例的测试数据 raw_df <- data.frame( x = c( "2. Nepsalus jezoensis", "species, insects", "3. Prochas sp. 2 YYH-2022a", "species, wasps, ants & bees", "4. Prochas sp. 1 YYH-2022a", "species, wasps, ants & bees", "5. Eccoptopterus sp. 1 CP-2022", "species, beetles", "6. Andricus sp. 1 CYS-2022a", "species, wasps, ants & bees", "7. Paralabellula curvicauda", "species, earwigs", "8. Paralabellula", "genus, earwigs", "9. Pristiphora sp.", "species, hymenopterans", "10. Phyllotreta flexuosa", "species, beetles" ) ) # 2. 按奇偶位置拆分两类数据 # 取奇数行,用正则移除开头的数字编号、点和空格,得到干净物种名 col_x <- gsub("^[0-9]+\\.\\s", "", raw_df$x[c(TRUE, FALSE)]) # 取偶数行,直接得到类群属性 col_y <- raw_df$x[c(FALSE, TRUE)] # 3. 组装为最终两列数据框 result <- data.frame( x = col_x, y = col_y )
代码逻辑说明:
- 逻辑向量
c(TRUE, FALSE)会自动循环匹配向量长度,依次取出所有奇数位置的元素;c(FALSE, TRUE)同理取出所有偶数位置元素 - 正则规则
^[0-9]+\\.\\s匹配行首的1个或多个数字、紧跟的英文点、以及点后的空格,替换为空即可清除编号前缀
方案2:tidyverse实现(适配管道化数据处理工作流)
如果日常数据处理使用tidyverse生态,可通过以下代码实现,逻辑更易读,方便后续衔接其他数据处理步骤:
library(dplyr) library(stringr) library(tidyr) result <- raw_df %>% # 生成行号标记 mutate(row_num = row_number()) %>% # 为两两配对的行分配相同分组ID mutate(pair_id = ceiling(row_num / 2)) %>% # 标记每行属于物种名/类群属性 mutate(col_type = ifelse(row_num %% 2 == 1, "x", "y")) %>% # 宽表转换为两列结构 pivot_wider(id_cols = pair_id, names_from = col_type, values_from = x) %>% # 清理物种名的编号前缀 mutate(x = str_remove(x, "^[0-9]+\\.\\s")) %>% # 移除辅助列 select(-pair_id)
效果参考
处理完成后得到的两列结构化数据效果如下:
注意事项
- 如果读入的原始数据包含第一行列名
x,需要在拆分前先过滤掉第一行表头,避免数据错位 - 上述正则规则可兼容1位、多位数字的编号格式,无需额外调整
内容的提问来源于stack exchange,提问作者Pedro Alexander Velasquez Vasc
相关产品推荐
相关产品推荐

