2016-09-24 80 views
1

我有一個文本文件有兩列(也許它只是標籤?)。其中一列的數據如下所示:TC012950_CDS_3428_4122
第一個數字是TC#,第二個CDS,第三個起始位置,第四個結束位置。 其他列有一個值是這樣的:11.93631拆分列數據,添加數據,重新合併在一起

我有一個包含由製表分裂染色體信息的另一個文本文件:

ChLG10 protein_coding表達3428 5582。 - 。 TC012950

我的首要目標是最終結合染色體名稱(ChLG10)進入第一個文件的列,因此它看起來像: TC012950_ChLG10_3428_4122
與第二列仍包含其原始值。

我已經嘗試把數據放入數組或數據框,但然後我很難分裂第一列。我不斷收到錯誤,說更換有0行等。因此,我希望也許有人在這裏指出我正確的方向。

如何使用_將第一列分成多列?有沒有辦法將它們分成多個標籤? 之後,我需要將每行與其他數據中的相應行進行匹配,以便我可以將Chr位置列放在TC#和CDS列之間。一旦位於正確的位置,那麼我需要將所有列重新合併在一起,並用_分隔。我在想,如果我用tab做了什麼,那麼我會再用_替換這個選項卡?任何建議或幫助是值得歡迎的。提前感謝你!

+1

有做你的無窮的方法'問,但我們需要一些數據。 – Abdou

回答

0

您可以在sub函數中使用正則表達式將所需值放入第一列。我只是用兩個數據幀僞造你的數據。是

dat1<-data.frame(V1='TC012950_CDS_3428_4122', Value='11.93631', stringsAsFactors=F) 
print(dat1) 
        V1 Value 
1 TC012950_CDS_3428_4122 11.93631 

dat2<-data.frame(V1='ChLG10',V2='protein_coding', V3='mRNA') 
print(dat2) 
     V1    V2 V3 
1 ChLG10 protein_coding mRNA 

# loop over the rows in the data.frames 
for (i in 1:nrow(dat1)) { 
    dat1$V1[i] <- sub('_[A-Za-z0-9]+_',paste('_',dat2$V1[i],'_',sep=''),dat1$V1[i]) 
} 
print(dat1) 
        V1 Value 
1 TC012950_ChLG10_3428_4122 11.93631 

sub的參數如下所示:尋找—一個或多個數字或字母之間有兩個 下劃線

  1. 圖案;在這種情況下,字符類(\\w)將不起作用,因爲它們之間包含下劃線
  2. 字符串以及來自第二個文件 的所需代碼; paste只是串接,並使用一個空字符串 隔板
  3. 目標串來修改(第二文件的第一列)

sub將僅更換第一次出現。

0

將列分成多列的一種方法是通過tidyr::separate。分開後,您可以使用tidyr::unite將它們再次合併。

library(tidyr) 
df = data.frame(A = c("1_2_3","4_5_6")) 
df2 = df%>%separate(col="A",into=c("A","B","C"),sep = "_") 

輸出:

A B C 
1 1 2 3 
2 4 5 6 

然後可以團結柱以任何順序如下:

df2%>%unite(col="new",B,C,A,sep="_") 

輸出:

new 
1 2_3_1 
2 5_6_4