删除子序列并将字符串插入序列中

时间:2014-01-23 18:18:42

标签: r

我有一个数据文件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

谢谢。

2 个答案:

答案 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="")