在R语言中匹配字符串片段并拼接生成新列的实现方法
提取并拼接GTF文件中含"gene"标识的字段
需求说明
从拆分后的GTF数据中,提取所有包含"gene"标识的字段,按行拼接成新列Gene_Name,无匹配内容的行填充NA。
解决方案代码
基于你已有的代码,使用dplyr、tidyr和splitstackshape工具完成处理:
# 加载所需包 library(dplyr) library(tidyr) library(splitstackshape) # 读取并预处理数据(你的原始代码) DP_GTF <- read.delim("E:/Genome_Files/GTF/DolosPig51524.gtf", sep = "\t", comment.char = "#", header = F) %>% subset(V3 == "CDS") %>% cSplit("V9", ";") # 1. 给每行添加唯一行标识,避免合并时出错 DP_GTF <- DP_GTF %>% rowid_to_column("row_id") # 2. 提取所有V9拆分列,筛选含"gene"的内容并按行拼接 gene_info <- DP_GTF %>% # 将分散的V9_xx列转为长格式 pivot_longer(cols = starts_with("V9_"), names_to = "col_name", values_to = "gene_str") %>% # 过滤空值和不含"gene"的条目,同时去除字符串前后空格 filter(!is.na(gene_str) & stringr::str_detect(gene_str, "gene")) %>% mutate(gene_str = trimws(gene_str)) %>% # 按行分组拼接匹配到的内容 group_by(row_id) %>% summarise(Gene_Name = paste(gene_str, collapse = ", ")) %>% ungroup() # 3. 合并回原数据,无匹配内容的行填充NA DP_GTF_final <- DP_GTF %>% left_join(gene_info, by = "row_id") %>% # 移除临时行标识列 select(-row_id) %>% # 将空字符串转为标准NA mutate(Gene_Name = ifelse(is.na(Gene_Name) | Gene_Name == "", NA, Gene_Name))
代码说明
rowid_to_column:给每行添加唯一ID,确保后续合并时能准确对应原行数据。pivot_longer:将拆分后的多列V9_01、V9_02等转为长格式,方便统一筛选。str_detect:精准匹配包含"gene"的字符串,结合filter过滤无效内容。paste(collapse = ", "):将同一行的多个"gene"条目拼接为逗号分隔的字符串。left_join:保留原数据所有行,无匹配内容的Gene_Name列自动填充NA,最后通过mutate统一空值格式。
内容的提问来源于stack exchange,提问作者dbro970
相关产品推荐
相关产品推荐

