R语言如何实现dataframe同行GO编码与对应描述配对分组
R实现GO编码与对应描述配对拼接
处理这类分号分隔的关联值格式数据,按元素特征分类后按顺序配对即可,不需要复杂的正则操作。
输入数据复现
df <- data.frame( Protein = c("a", "b"), ID = c("F_GO_0015;F_glycine","F_GO_00037;F_GO_00041;F_mRNA;F_cysteine") ) df
输入数据预览:
Protein ID 1 a F_GO_0015;F_glycine 2 b F_GO_00037;F_GO_00041;F_mRNA;F_cysteine
处理思路
- 按
;把每行ID拆分为独立的元素向量 - 从向量中分离两类元素:所有带
GO_前缀的编码项、所有不带GO_前缀的描述项,两类元素按出现顺序一一对应 - 每对编码和描述用
-拼接为一组,所有拼接完成的组重新用;连接为字符串,替换原ID列即可
实现代码(基础R版,无额外依赖)
match_go_pair <- function(x) { # 拆分单个字符串为元素向量 id_parts <- unlist(strsplit(x, ";")) # 提取所有GO编码项 go_items <- id_parts[grepl("GO_", id_parts)] # 提取所有对应的描述项 desc_items <- id_parts[!grepl("GO_", id_parts)] # 按顺序配对拼接 paired_parts <- paste(go_items, desc_items, sep = "-") # 合并为符合要求的字符串 paste(paired_parts, collapse = ";") } df.new <- df df.new$ID <- sapply(df$ID, match_go_pair, USE.NAMES = FALSE)
结果验证
运行后输出的df.new完全匹配预期结果:
Protein ID 1 a F_GO_0015-F_glycine 2 b F_GO_00037-F_mRNA;F_GO_00041-F_cysteine
提示:该逻辑默认输入数据中GO编码的数量和对应描述的数量完全相等,和示例格式一致。如果数据存在格式异常(比如编码和描述数量不匹配),可以在函数中增加长度校验逻辑,避免出现配对错位的问题。
内容的提问来源于stack exchange,提问作者Marta López
相关产品推荐
相关产品推荐

