组合标题部分相同的字符串

时间:2015-01-30 17:49:51

标签: r

我有一个这样的文件:

>mmu-let-7g-5p MIMAT0000121 Mus musculus let-7g-5p
UGAGGUAGUAGUUUGUACAGUU
>mmu-let-7g-3p MIMAT0004519 Mus musculus let-7g-3p
ACUGUACAGGCCACUGCCUUGC
>mmu-let-7i-5p MIMAT0000122 Mus musculus let-7i-5p
UGAGGUAGUAGUUUGUGCUGUU
>mmu-let-7i-3p MIMAT0004520 Mus musculus let-7i-3p
CUGCGCAAGCUACUGCCUUGCU
....
....

我想根据标题mmu-let-7g, mmu-let-7i, etc的这一部分组合具有相同标题的字符串

输出:

>mmu-let-7g
UGAGGUAGUAGUUUGUACAGUU ACUGUACAGGCCACUGCCUUGC
>mmu-let-7i
UGAGGUAGUAGUUUGUGCUGUU CUGCGCAAGCUACUGCCUUGCU

2 个答案:

答案 0 :(得分:2)

您可以使用readLines读取文件,删除以“ - ”开头的“行”的后缀部分('lines1')。这只会删除标题行的后缀。创建一个TRUE / FALSE的索引('indx')。将标题行与基数分开,使用由“标题”分组的聚合函数(tapply)和基线一起paste。您可以通过重新排列“v1”来获得“v2”

的预期结果
lines <- readLines('file.txt')
lines1 <- sub('-.. .*', '', lines)
indx <- c(TRUE, FALSE)
v1 <- unname(tapply(lines1[!indx], lines1[indx],
                           FUN=paste, collapse=' '))

v2 <-  c(rbind(unique(lines1[indx]), v1))
v2 
# [1] ">mmu-let-7g"                                  
# [2] "UGAGGUAGUAGUUUGUACAGUU ACUGUACAGGCCACUGCCUUGC"
# [3] ">mmu-let-7i"                                  
# [4] "UGAGGUAGUAGUUUGUGCUGUU CUGCGCAAGCUACUGCCUUGCU"

更新

假设标题中的字符串跨越多行。 (在这种情况下,它将是相同的结果。)在这里,您可以基于从标题行的位置创建分组变量(cumsum(grepl(...))将行(“lines1”)拆分为“列表”。然后,paste将多行放在一起,unlist。如上所述使用tapply汇总。

lines2 <-  unlist(lapply(split(lines1, cumsum(grepl('>', lines1))),
         function(x) c(x[1],paste(x[-1], collapse=''))), 
                          use.names=FALSE)
v1 <- tapply(lines2[!indx], lines2[indx], FUN=paste, collapse=' ')
v2 <- c(rbind(names(v1), unname(v1)))
v2
#[1] ">mmu-let-7g"                                  
#[2] "UGAGGUAGUAGUUUGUACAGUU ACUGUACAGGCCACUGCCUUGC"
#[3] ">mmu-let-7i"                                  
#[4] "UGAGGUAGUAGUUUGUGCUGUU CUGCGCAAGCUACUGCCUUGCU"

答案 1 :(得分:1)

第一步是阅读多行格式。 scan函数允许这样做,如果你还提供一个列表作为什么参数(并且你使用命名列表。这适合转换为数据帧:

> dat <- as.data.frame( scan(what =list( V1="", V2="", V3="", V4="", V5="", V6=""), multi.line=TRUE)  )
1: >mmu-let-7g-5p MIMAT0000121 Mus musculus let-7g-5p
1: UGAGGUAGUAGUUUGUACAGUU
2: >mmu-let-7g-3p MIMAT0004519 Mus musculus let-7g-3p
2: ACUGUACAGGCCACUGCCUUGC
3: >mmu-let-7i-5p MIMAT0000122 Mus musculus let-7i-5p
3: UGAGGUAGUAGUUUGUGCUGUU
4: >mmu-let-7i-3p MIMAT0004520 Mus musculus let-7i-3p
4: CUGCGCAAGCUACUGCCUUGCU
5: 
Read 4 records

然后,您希望根据第一个或第五个参数的子字符串粘贴项目。确切的规则将取决于您对这些核苷酸序列,microRNA的命名惯例的更大知识? tapply函数在由其第二个参数定义的类别内执行操作。在这里,我简单地修剪了第五个项目的短划线( - )和最后2个字符,但是如果你想要物种指示符,你可以在第一列上工作:

> tapply(dat$V6, sub("-..$","", dat$V5), paste, collapse=" ")
                                         let-7g 
"UGAGGUAGUAGUUUGUACAGUU ACUGUACAGGCCACUGCCUUGC" 
                                         let-7i 
"UGAGGUAGUAGUUUGUGCUGUU CUGCGCAAGCUACUGCCUUGCU"