我有一个注释文件,我想解析FlyBase脚本ID以创建一个新列。我已经尝试过正则表达式,但它还没有奏效。不确定我是否可能没有正确使用它。 ID位于字符串的开头或中间,这种情况是来自不同数据库的ID的集合。可能还有多个FlyBase ID,在这种情况下,我想使用像ID1/ID2
这样的分隔符。
示例注释行:"AY113634 // --- // 100 // 2 // 2 // 0 /// FBtr0089787 // --- // 100 // 2 // 2 // 0"
"FBtr0079338 // --- // 100 // 15 // 15 // 0 /// FBtr0086326 // --- // 100 // 15 // 15 // 0 /// FBtr0100846 // --- // 100 // 15 // 15 // 0 /// NONDMET000145 // --- // 100 // 15 // 15 // 0 /// NONDMET000970 // --- // 100 // 15 // 15 // 0 /// NONDMET000971 // --- // 100 // 15 // 15 // 0"
我想创建一个维护相同顺序的列,但只在必要时才包含带分隔符的FlyBase ID。我正在使用data.table
包,所以如果有一个使用数据表的解决方案,将非常感激。我的一个想法是使用sub
,搜索[FBtr][0-9+]
(不确定是否正确),如果它不匹配该模式,则将其替换为{{1} }}。
示例表:
""
答案 0 :(得分:0)
这是让你入门的东西,我可以在你更好地了解你的" data.table"之后更新答案。看起来像:
x <- "FBtr0079338 // --- // 100 // 15 // 15 // 0 /// FBtr0086326 // --- // 100 // 15 // 15 // 0 /// FBtr0100846 // --- // 100 // 15 // 15 // 0 /// NONDMET000145 // --- // 100 // 15 // 15 // 0 /// NONDMET000970 // --- // 100 // 15 // 15 // 0 /// NONDMET000971 // --- // 100 // 15 // 15 // 0"
sapply(strsplit(x, "/+"), function(s) grep("FBtr", trimws(s), value=TRUE))
# [,1]
#[1,] "FBtr0079338"
#[2,] "FBtr0086326"
#[3,] "FBtr0100846"
sapply(strsplit(x, "/+"), function(x) paste0(grep("FBtr", trimws(x), value=TRUE), collapse = ";"))
#[1] "FBtr0079338;FBtr0086326;FBtr0100846"
要分配到数据表中的新列:
x$FBtr <- sapply(strsplit(x$V3, "/+"), function(x) paste0(grep("FBtr", trimws(x), value=TRUE), collapse = ";"))
实质上,您可以提供包含x
的注释的列。
答案 1 :(得分:0)
更具体针对data.table
,并使用stringr
包:
library(stringr)
x[, .(IDs = str_c(unlist(str_extract_all(V3, "(FBtr)[0-9]+")),
collapse = "/")), by = probesetID]