我有一个数据文件here,它通过以下方式导入R:
eya4_lagan_HM_cp <- "E:/blahblah/eya4_lagan_HM_cp.txt"
eya4_lagan_HM_cp <- readChar(eya4_lagan_HM_cp, file.info(eya4_lagan_HM_cp)$size)
标记位置为“1”的第一个字符串,将最后一个字符串标记为位置“311,522”(注意序列总共包含311,522个字符)。我有两个密切相关的查询。
查询1)
现在我有一个包含位置列表here的数据文件。以“对”读取位置,即以第一对44184和44216为例。我希望从前一个序列eya4_lagan_HM_cp
中删除位置44184(含)到44216(含)的子序列,并在其位置插入字符#。换句话说,用#替换44184到44216的子序列。我想对剩下的对,即对于151795和151844这样做,我想从eya4_lagan_HM_cp
中的位置151795(包括)删除到151844(含),并将其替换为#,等等上。
查询2)
现在我想对具有位置列表的数据文件做一些略微不同的事情。再以第一对为例。我想在位置44184之前插入一个#right ,换句话说,在eya4_lagan_HM_cp
中的位置44183和44184之间插入#,然后我想插入一个#right 在位置44216之后,即在位置44216和44217之间插入#。我想对所有位置对重复此过程。所以对于下一对,我希望 151795之前的#right 和 151844之后的#right 。
谢谢。
答案 0 :(得分:1)
e <- eya4_lagan_HM_cp <- readChar("eya4_lagan_HM_cp.txt", file.info("eya4_lagan_HM_cp.txt")$size)
pairs <- as.numeric(readLines("CDS coordinates.txt"))
idx1 <- pairs[seq(1, length(pairs), 2)]
idx2 <- pairs[seq(2, length(pairs), 2)]
e.split <- strsplit(e, "")[[1]]
# no1
hashIndices <- unlist(mapply(seq, from=idx1, to=idx2))
e.split[hashIndices] <- "#"
e.new <- paste(e.split, collapse="")
# no2
for (idx in c(idx1, idx2+1))
e.split <- c(e.split[1:(idx-1)], "#", e.split[idx:length(e.split)])
e.new <- paste(e.split, collapse="")
修改:
参考评论的另一个尝试:e.split <- strsplit(e, "")[[1]]
之后
# no1
deleteIndices <- unlist(mapply(seq, from=idx1+1, to=idx2))
e.split[idx1] <- "#"
e.new <- paste(e.split[-deleteIndices], collapse="")
或
# no2
for (idx in c(idx1, idx2+2))
e.split <- c(e.split[1:(idx-1)], "#", e.split[idx:length(e.split)])
e.new <- paste(e.split, collapse="")
答案 1 :(得分:0)
如果您认为要替换的字符串是唯一的,您可以尝试substr()
和gsub()
的组合。 (如果您只需要进行一次替换,则只需要substr
。)例如,如果您将位置对加载到2列矩阵pp
中,则查询1可能是
for(i in 1:nrow(pp)) {
ss <- substr(eya4_lagan_HM_cp,start=pp[i,1],stop=pp[i,2])
eya4_lagan_HM_cp = gsub(ss,"#",eya4_lagan_HM_cp)
}
和查询2
for(i in 1:nrow(pp)) {
ss <- substr(eya4_lagan_HM_cp,start=pp[i,1],stop=pp[i,2])
eya4_lagan_HM_cp <- gsub(ss,paste("#",ss,"#",sep=""),eya4_lagan_HM_cp)
}
如果您不能认为要替换的字符串是唯一的,您可以将字符串eya4_lagan_HM_cp
分解为字符串向量:
vv <-unlist(strsplit(eya4_lagan_HM_cp,split=""))
使用向量子集来删除/插入,例如,用于查询1,
new.vv <- c(vv[1:(pp[1,1]-1)],"#")
for(i in 1:(nrow(pp)-1)) {
new.vv <-c(new.vv,vv[(pp[i,2]+1):(pp[(i+1),1]-1)],"#")
}
new.vv <- c(new.vv,vv[(pp[2,nrow(pp)]+1):length(vv)])
然后将其粘贴在一起作为一个字符串
eya4_lagan_HM_cp <- paste(new.vv,sep="")