2014-01-23 75 views
0

我有一個數據文件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」和最後一個字符串作爲位置「311522」 (注意該序列總共包含311,522個字符)。我有兩個密切相關的查詢。

查詢1)

現在我有一個位置here列表的數據文件。這些頭寸是以「雙」的形式讀取的,即以第一對44184和44216爲例。我希望從前面的序列eya4_lagan_HM_cp中刪除位置44184(含)的子序列到位置44216(含),並在其位置插入字符#。換句話說,用#來替換從44184到44216的子序列。我想用剩下的對來做這件事,也就是說,對於151795和151844,我想從中的位置151795(含)中刪除到151844(含),並用#代替它,等等。

查詢2)

現在我想做些事情與位置的列表中的數據文件略有不同。再以第一對爲例。我想在位置44184之前插入一個#右邊,換句話說,在位置44183和44184之間插入一個#eya4_lagan_HM_cp,然後我想在位置44216之後插入一個#右邊,即插入一個#號職位44216和44217.我想對所有職位對重複此過程。因此,對於下一對,我想一個#右之前 151795和#右 151844.

謝謝。

回答

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="") 
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="") 
+0

謝謝。對於'#no1',我想我沒有正確地說出我的查詢。我真正想要的是從位置44184刪除到44216(含),然後用ONE#代替整個序列,而不是每個位置的#,與所有其他對相同。我怎樣才能做到這一點? 對於'#no2',我認爲代碼有錯誤,例如代碼給出的第一個位置對:f#apkkaakafmfffakkannpaaapkacfaapf#dk,而#的正確位置應該是:f#apkkaakafmfffakkannpaaapkacfaapfd#k。這也適用於其他位置對。似乎#只是一點點關閉。 – user3184733

+0

@ user3184733糟糕!我對帖子進行了編輯。 – lukeA

+0

謝謝! '#no1'現在好了。至於'#no2',雖然第一個位置對是固定的,但第二個等仍然有點不合適。例如,代碼給出#kkpaaakaaaafkpkfbfakaaofakapkpppfcgaanfpfakaappff#akkp,而它應該是ak#kpaaakaaaafkpkfbfakaaofakapkpppfcgaanfpfakaappffak#kp。換句話說,151795到151844的位置需要是**原始**序列的位置,而不是已經插入#的序列,如果你知道我的意思是haha – user3184733