2016-09-24 8 views
1

私は2つの列を持つテキストファイルを持っています。列の1つに次のようなデータがあります。TC012950_CDS_3428_4122
最初の番号はTC#、2番目のCDS、3番目の開始位置、4番目の終了位置です。 5582 mRNAの3428 protein_codingデータを分割してデータを追加し、一緒に復習します

ChLG10:11.93631

が、私はタブで分割染色体情報が含まれている別のテキストファイルを持っている: 他の列には、このような一つの値を持っています。 - 。まだ元の値を含む第二の柱で TC012950_ChLG10_3428_4122
:TC012950

私の包括的な目標は、それがどのように見えるので、最終的には最初のファイルの列に染色体名(ChLG10)を内蔵することです。

データを配列やデータフレームに入れようとしましたが、最初の列を分割するのが苦労します。私は交換に0行などがあると言うエラーが出てくる。したがって、私はここにいる誰かが正しい方向に私を向けることができたと思っていました。

_最初の列を複数の列に分割するにはどうすればよいですか?おそらくそれらをタブに分割する方法はありますか? その後、Chr Location列をTC#とCDS列の間に置くことができるように、各行を他のデータの対応する行に一致させる必要があります。それが正しい場所に置かれたら、すべての列を一緒に結合し、_で区切る必要があります。私はタブで何かをしたら、そのタブを再び_に置き換えようと思っていますか?アドバイスや助けを歓迎します。あまり前もってありがとう!

+1

あなた何をやっての無限の方法があります。しかし、我々はいくつかのデータが必要です。 – Abdou

答えて

0

sub関数の正規表現を使用して、目的の値を最初の列に入れることができます。私はちょうど2つのデータフレームであなたのデータを偽った。次のように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 

引数は、2つの 下線間— 1桁以上の数字や文字を探すために

  1. パターン。この場合、単語文字クラス(\\w)はアンダースコアを含む
  2. 文字列と2番目のファイルの希望するコードが含まれているため、この場合は機能しません。 ; pasteだけ(第2のファイルの最初の列)を変更するターゲット文字列が
  3. セパレータは空の文字列を連結して使用

subのみ最初の発生を置き換えます。

0

複数の列に列を分割する方法の1つは、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 
関連する問題