在R

时间:2017-10-12 17:10:31

标签: r string parsing data.table bioinformatics

我有一个注释文件,我想解析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} }}。

示例表: ""

2 个答案:

答案 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]