El archivo de anotaciones estándar de usearch se convierte en un archivo de anotaciones estándar de 8 columnas sintax2taxonomy

En un ppt de Yishengxin, apareció un archivo de comentarios estándar de dos columnas y un archivo de comentarios de ocho columnas. El archivo de comentarios de ocho columnas se usó en un paso posterior, pero el ppt no dio una conversión del archivo de comentarios estándar usearch otus .sintax al estándar El código del archivo de comentarios de ocho columnas, así que intenté escribirlo manualmente

Pero el comando de shell no me resulta familiar, así que lo escribí en R.

Por ejemplo, la primera línea de sintaxis en mi mano es:

OTU_1 k: Bacteria (1.00), p: Proteobacteria (1.00), c: Betaproteobacteria (1.00), o: Burkholderiales (1.00), f: Oxalobacteraceae (1.00), g: Herbaspirillum (0.66), s: Sclerotinia_homoeocarpa (0.66) + k: Bacteria, p: Proteobacteria, c: Betaproteobacteria, o: Burkholderiales, f: Oxalobacteraceae

Siempre que Bacteria, Proteobacteria, Betaproteobacteria, Burkholderiales, Oxalobacteraceae, Herbaspirillum, Sclerotinia_homoeocarpa se puedan extraer por separado. La idea es usar primero read.table para leer el archivo sintax para obtener el marco de datos:

V1 es el nombre de otu, V2 es más completo que V4:

> ingrese $ V4 [1]
[1] "k: Bacteria, p: Proteobacteria, c: Betaproteobacteria, o: Burkholderiales, f: Oxalobacteraceae"
> ingrese $ V2 [1]
[1] "k: Bacteria (1.00), p : Proteobacteria (1.00), c: Betaproteobacteria (1.00), o: Burkholderiales (1.00), f: Oxalobacteraceae (1.00), g: Herbaspirillum (0.66), s: Sclerotinia_homoeocarpa (0.66) "

Por lo tanto, elija V2 para la segmentación de cadenas. Primero divida la coma como separador para obtener:

[1] "k: Bacteria (1.00)" "p: Proteobacteria (1.00)" "c: Betaproteobacteria (1.00)"     
[4] "o: Burkholderiales (1.00)" "f: Oxalobacteraceae (1.00)" "g: Herbaspirillum (0.66) "         
[7]" s: Sclerotinia_homoeocarpa (0.66) "

Para cada cadena, como "k: Bacteria (1.00)", use substr para interceptar el tercer (incluido) al sexto (sin incluir) caracteres desde la parte inferior:

substr (str, 3, nchar (str) -6) 
[1] "Bacterias"

nchar () es una función para encontrar la longitud de una cadena.

Finalmente, coloque cada cadena recortada otu en una lista como una fila de taxonomía, y finalmente rbind cada columna y envíela.

Tenga en cuenta que debido a que algunos otu no usan s y g, etc., si el número de cadenas divididas es menor que 7, se complementará con 'na'.

El código final es el siguiente:


filepath='D:/Rdata/50/result' #your file path,please change before use
setwd(filepath)
# transform otus.sintax to taxnomy.txt
input = read.table("otus.sintax", header=F, sep="\t", comment.char="", stringsAsFactors=F)#read the sintax 
title=paste('OTUID','Kingdom','Phylum','Class','Order','Family','Genus','Species',sep='\t')#creatw the header
output=title
for(i in 1:nrow(input)){
  name=input$V1[i]#otu name
  seed=input$V2[i]
  seed_group=strsplit(seed,',')#string group
  g=1#answer group for every row
 
    for (j in 1:length(seed_group[[1]])) {
      str=seed_group[[1]][j]
    g[j]=substr(str,3,nchar(str)-6)    #intercept string
    }
  for (j in length(g)+1:7){
    g[j]='na' #fill with "na"
  }
  data=paste(name,g[1],g[2],g[3],g[4],g[5],g[6],g[7],sep='\t')
  output=rbind(output,data)#splicing each row
}

  
  
write(output,'taxonomy.txt')

Debido a la pereza, no se escribe como una llamada de función.

Supongo que te gusta

Origin blog.csdn.net/qq_36614557/article/details/114907257
Recomendado
Clasificación