使用标识符转置数据

时间:2016-10-24 21:14:47

标签: r bash bioinformatics blast

我的文本文件(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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

考虑运行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" 逐行读取文本文件,构建一个大的字符向量列表。下面还迭代地将节标题(即 Query1 Query2 )映射到各个字符向量的名称:

[
    {
        "FirstName": "Test",
        "LastName": "Account2"
    }
]

答案 2 :(得分: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)