我有一个这样的文件:
>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
答案 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"