2016-10-24 8 views
0

1列のテキストファイル(blast software output)と、以下のような約40,000行があります。識別子を使用してデータを転置する

基本的に、私は、クエリ名とクエリを含む他の列を含む最初の列を持つ複数の列にこれを変換するために、Rまたは端末を使用したいが、新しい列に追加し、それぞれのヒットでヒット

入力はこれです

Query1 
result1 
result2 
result3 

Query2 
result1 
result2 
result3 
result4 
result5 

Query3 
result1 
result2 
result3 
result4 

の予想される出力

Query1 result1 result2 result3 
Query2 result1 result2 result3 result4 result5 
Query3 result1 result2 result3 result4 
+0

*爆発出力*とは何ですか?どのような形式の-txt? Rタイプ - ベクトル、リスト、データフレーム? – Parfait

+0

申し訳ありませんが、爆発の部分は重要ではなく、データベースからタンパク質を同定するプログラムです。出力は、上記のように1列と〜40,000行のテキストファイルです。私は、単一のクエリで特定された異なるタンパク質を集計したいだけです。私は必ずしもRを使用する必要はありませんが、それを行う方法を知るために役立つでしょう –

答えて

1

readLines()を実行してテキストファイルを1行ずつ読み込み、文字ベクタの大きなリストを作成することを検討してください。また、反復的に個々の文字ベクトルの名にセクションヘッダ(すなわちQuery1をQUERY2)にマップの下には:

con <- file("/path/to/text/file.txt", open="r") 

datalist <- c() 
while (length(line <- readLines(con, n=1, warn = FALSE)) > 0) { 

    if (grepl("Query", line)==TRUE){ 
    query <- c()            # RESET VECTOR 
    qName <- line            # CAPTURE QUERY NAME 
    } 
    else if (grepl("([A-Za-z])", line)==TRUE){ 
    query <- c(query, line)         # APPEND LINE TO VECTOR 
    } 
    else if (line == ""){ 
    datalist <- c(datalist, setNames(list(query), qName))  # APPEND NAMED VECTOR TO LIST 
    } 
} 

datalist <- c(datalist, setNames(list(query), qName))   # REMAINING LAST SECTION 
close(con) 

datalist 

# $Query1 
# [1] "result1" "result2" "result3" 

# $Query2 
# [1] "result1" "result2" "result3" "result4" "result5" 

# $Query3 
# [1] "result1" "result2" "result3" "result4" 
1

は、それは非常にエレガントではありませんが、あなたのデータを仮定するとdataと呼ばれるベクトルで、あなたは、リスト項目に分割するために、このような何かを行うことができます(ここで私は「q」を使用)に分割するユニークなものを持っている:

index <- c(grep("^q", data), length(data)+1) 
reps <- c() 
for (i in 1:(length(index)-1)) reps <- append(reps, rep(i, index[i+1]-index[i])) 
split(data, reps) 

また、あなたの区切り文字は、クエリ結果のブロック間のスペースがあれば、あなたreadLinesで読むことができます。grep("^$", data)

0

は(私はそれが存在していないアイデアを持っていたあなたの助けとのreadLine機能を示唆両方ありがとう)上記のコードは実際に私が望んでいた出力を生成しませんでしたが、自分のコードを修正して自分自身のものを書くことができました。私はRに新しく、一般的にコーディングするので、おそらく最も洗練されたコードではないかもしれませんが、それは仕事を終えました。ここにあります:

con<- file("blast5.txt", open = "r") 
## Calculate rows and column needed 
l<-0; w<-0; i<-0 
while (length(line <- readLines(con, n=1, warn = FALSE)) > 0) { 
if (grepl("Query", line)==TRUE){ 
l=l+1 
if (i>w){ 
    w<-i 
} 
i<-0 
    } 
    else if (grepl(">", line)==TRUE){ # COUNT RESULTS UNDER EACH QUERY 
i<-i+1 
    } 
} 
# Make an empty array to store the data 
blast<- array(NA,c(l,w+1)) 
close(con) 
i<- 0; j<-1 
con<- file("blast5.txt", open = "r") 
while (length(line <- readLines(con, n=1, warn = FALSE)) > 0) { 

    if (grepl("Query", line)==TRUE){ 
    i=i+1 
    j<-1 
    blast[i,1] <- line   #STORE QUERY NAME IN FIRST COLUMN 
    } 
    else if (grepl(">", line)==TRUE){ 
    j<-j+1 
    blast[i,j]<- line   #STORE RESULTS IN SEPARATE COLUMNS 
    } 
} 
close(con) 
関連する問題