Bauder LIQUITEC 防水系统材料与工具说明

防水系统材料 / Materialien

  1. Bauder LIQUITEC PU-D (2,5 kg)

    • 类型:聚氨酯单组份液体防水涂料
    • 用途:屋顶、阳台、露台防水
    • 功能:形成无缝、高弹性、防水膜
  2. Bauder LIQUITEC Vlies PV165 (0,25 m x 4,0 m)

    • 类型:纤维增强毡/纤维网
    • 用途:与 PU-D 配合使用
    • 功能:增强防水层强度,防止开裂
  3. Bauder LIQUITEC RG 0,25 l

    • 类型:涂料底漆 / 表面处理剂
    • 用途:改善 PU-D 涂料与基层附着力
    • 功能:防止基层吸收过多涂料,保证厚度均匀
  4. Bauder Primer Kunststoff

    • 类型:塑料表面专用底漆
    • 用途:用于塑料或非吸收性基层
    • 功能:提高 PU-D 涂料附着力

施工工具 / Werkzeuge

  1. Rührholz(搅拌棒)

    • 用途:搅拌 PU-D 或底漆,使涂料均匀
  2. Pinsel(刷子)

    • 用途:涂刷 PU-D、防水涂料或底漆
  3. Schleifpapier(砂纸)

    • 用途:打磨基层或塑料表面,提高附着力
  4. Einweghandschuhe(一次性手套)

    • 用途:保护双手,避免接触涂料
  5. Zimmermannsbleistift(木工铅笔)

    • 用途:标记施工区域或测量线
  6. Reinigungstuch(清洁布)

    • 用途:清理灰尘、污渍或多余涂料
  7. Verlegeanleitung(施工说明)

    • 用途:详细说明施工步骤、用量及安全注意事项

施工顺序示意 / Arbeitsablauf

  1. 清理基层 → 砂纸打磨 → 底漆(RG 或 Primer Kunststoff)
  2. 涂刷第一层 PU-D → 铺 Vlies PV165 → 涂第二层 PU-D
  3. 完成后清理工具

🏔️ Zillertal & Umgebung – Skigebiete, Parkmöglichkeiten & Unterkunft

🏔️ 齐勒塔尔及周边 —— 滑雪场、停车信息与住宿


🎿 Fahrzeiten & Parkmöglichkeiten inklusive Kartenlinks

🎿 包含导航链接的预计车程与停车信息

Skigebiet / 滑雪场 Adresse / 地址 Parkplatz / 停车信息 Fahrzeit ab Gallzein / 预计车程 Karte / 地图链接
Spieljoch – Fügen Hochfügener Straße 400, 6263 Fügen, Österreich Kostenlose & ausreichende Parkplätze direkt an der Talstation / 免费停车场就位于缆车山脚站 ca. 40–50 Min Google Maps: Spieljochbahn I Talstation
Kaltenbach – Hochzillertal/Hochfügen (Ski-Optimal) Kaltenbach 145, 6272 Kaltenbach, Österreich Großes Parkhaus direkt bei der Talstation, Hochfügen: Parkplätze an den Liftbasen / 大停车楼在卡尔滕巴赫缆车站旁,高菲根缆车基站也有停车位 ca. 45-60 Min Google Maps: Kaltenbach Talstation Hochzillertal
Zillertal Arena – Zell am Ziller / Gerlos / Königsleiten / Hochkrimml Rohr 23 & Rohr 26a, 6280 Zell am Ziller, Österreich Asphaltierte Flächen, Parkhäuser, teilweise kostenfrei / 停车基础设施多样,有些停车楼,有些免费 ca. 30-60 Min Google Maps: Zell am Ziller Rosenalmbahn Talstation
Mayrhofen – Penken / Ahorn / Rastkogel / Eggalm (Mountopolis) Ahornstraße 853, 6290 Mayrhofen, Österreich Große Flächen bei der Ahornbahn (teils kostenpflichtig) / Penkenbahn: wenig Parkplätze direkt → besser Ahorn​ ca. 50-65 Min Google Maps: Ahornbahn Talstation, Mayrhofen
Hintertuxer Gletscher Hintertux 794, 6294 Tux, Österreich Freiflächen + Parkgaragen, E-Ladestationen vorhanden / 停车楼 + 室外停车 + 电车充电桩 ca. 60-75 Min Google Maps: Talstation Hintertuxer Gletscher

🎿 Skigebiete im Zillertal

🎿 齐勒塔尔滑雪场概览

Die Region Zillertal in Tirol bietet eine Vielzahl an Skigebieten. Die Anfahrt erfolgt über gut ausgebaute Hauptstraßen ohne nennenswerte Steigungen, Parkmöglichkeiten sind meist ausreichend vorhanden (Parkhäuser, asphaltierte Plätze, vielfach kostenfrei).

奥地利蒂罗尔的齐勒塔尔地区拥有多个滑雪胜地。道路宽阔平坦,几乎没有明显坡度。大多数滑雪场都提供充足的停车位(停车楼、柏油地面,很多免费)。


🚗 Fahrzeiten & Parkmöglichkeiten

🚗 预计车程与停车信息

Skigebiet / 滑雪场 Adresse / 地址 Parkplatz / 停车信息 Fahrzeit ab Gallzein / 预计车程
Spieljoch – Fügen Hochfügener Straße 77, 6263 Fügen Kostenlose Parkplätze direkt an der Talstation / 免费停车场,位置方便 ca. 40–50 Min
Kaltenbach – Hochzillertal / Hochfügen (Ski-Optimal) Postfeldstraße 7, 6272 Kaltenbach (Parkhaus) / Hochfügen Talboden Großes Parkhaus (kostenfrei) / Hochfügen: kostenlose Parkplätze bei den Liften ca. 45–60 Min
Zillertal Arena – Zell am Ziller / Gerlos / Königsleiten / Hochkrimml Rosenalmbahn: Rohr 23, Zell am Ziller / Karspitzbahn: Rohr 26a, Zell am Ziller Asphaltierte Flächen, Parkhäuser, teilweise kostenfrei / 停车位充足,部分免费 ca. 30–60 Min
Mayrhofen – Penken / Ahorn / Rastkogel / Eggalm (Mountopolis) Ahornstraße 853, 6290 Mayrhofen Parkplätze bei der Ahornbahn (teils kostenpflichtig) / Penkenbahn kaum Parkplätze ca. 50–65 Min
Hintertuxer Gletscher Hintertux 794, 6294 Tux Freiflächen + Parkgaragen, E-Ladestationen / 室外及停车楼,配备电动车充电桩 ca. 60–75 Min

📌 Übersichtskarten & Pistenpläne / 滑雪地图与信息


🏡 Chalet Rastenhof – Unterkunft in Gallzein

🏡 Rastenhof木屋 —— Gallzein住宿

  • Adresse / 地址: Niederleiten 28, 6222 Gallzein
  • Website / 官网: rastenhof.at
  • Größe / 面积: 280 m², geeignet für bis zu 14 Personen / 可容纳14人

Ausstattung / 设施

  • 5 Schlafzimmer, 3 Bäder (Duschen + Badewanne)
  • Sauna, Terrasse, Balkon, Garten, Grillplatz
  • Private Küche mit Spülmaschine, Backofen, Kaffeemaschine etc.
  • Kinderfreundlich: Hochstühle, Spielplatz, Babybetten auf Anfrage
  • Wohnzimmer mit Sofa, Flachbild-TV, Minibar

Bezahlung / 支付方式

  • 10 % Anzahlung per Überweisung innerhalb von 7 Tagen
  • Restzahlung per Überweisung 2 Wochen vor Anreise
  • 预订时需支付房费的10%,余款需在到达前2周转账支付

🌄 Region Gallzein & Karwendel

🌄 Gallzein与Karwendel地区

  • Gallzein ist ein kleines, ruhiges Dorf auf ca. 800 m Seehöhe mit ca. 700 Einwohnern.
  • Lage im Silberregion Karwendel, nahe Inntal und Zillertal.
  • Ideal für Natururlaub, Wandern und Erholung.

Gallzein是一个宁静的小村庄,海拔约800米,约有700名居民。位于“银矿区”(Silberregion Karwendel),邻近因河谷和齐勒塔尔,适合亲近自然、徒步和度假。

📌 Weitere Ausflugsziele / 更多景点:


Fazit / 总结
Das Zillertal bietet ideale Bedingungen für Wintersport mit modernen Skigebieten und guten Parkmöglichkeiten. Das Chalet Rastenhof in Gallzein ergänzt dies perfekt als großzügige und komfortable Unterkunft für Familien und Gruppen.

齐勒塔尔地区滑雪条件优越,配备现代化滑雪场和完善的停车设施。Rastenhof木屋环境安静、设施齐全,非常适合家庭和团体入住。

Processing Data_Patricia_Transposon_2025 (Workflow for Structural Variant Calling in Nanopore Sequencing)

  1. install mambaforge https://conda-forge.org/miniforge/ (recommended)

    #download Mambaforge-24.9.2-0-Linux-x86_64.sh from website
    chmod +x Mambaforge-24.9.2-0-Linux-x86_64.sh
    ./Mambaforge-24.9.2-0-Linux-x86_64.sh
    
    To activate this environment, use:
        micromamba activate /home/jhuang/mambaforge
    Or to execute a single command in this environment, use:
        micromamba run -p /home/jhuang/mambaforge mycommand
    installation finished.
    
    Do you wish to update your shell profile to automatically initialize conda?
    This will activate conda on startup and change the command prompt when activated.
    If you'd prefer that conda's base environment not be activated on startup,
      run the following command when conda is activated:
    
    conda config --set auto_activate_base false
    
    You can undo this by running `conda init --reverse $SHELL`? [yes|no]
    [no] >>> yes
    no change     /home/jhuang/mambaforge/condabin/conda
    no change     /home/jhuang/mambaforge/bin/conda
    no change     /home/jhuang/mambaforge/bin/conda-env
    no change     /home/jhuang/mambaforge/bin/activate
    no change     /home/jhuang/mambaforge/bin/deactivate
    no change     /home/jhuang/mambaforge/etc/profile.d/conda.sh
    no change     /home/jhuang/mambaforge/etc/fish/conf.d/conda.fish
    no change     /home/jhuang/mambaforge/shell/condabin/Conda.psm1
    no change     /home/jhuang/mambaforge/shell/condabin/conda-hook.ps1
    no change     /home/jhuang/mambaforge/lib/python3.12/site-packages/xontrib/conda.xsh
    no change     /home/jhuang/mambaforge/etc/profile.d/conda.csh
    modified      /home/jhuang/.bashrc
    ==> For changes to take effect, close and re-open your current shell. <==
    no change     /home/jhuang/mambaforge/condabin/conda
    no change     /home/jhuang/mambaforge/bin/conda
    no change     /home/jhuang/mambaforge/bin/conda-env
    no change     /home/jhuang/mambaforge/bin/activate
    no change     /home/jhuang/mambaforge/bin/deactivate
    no change     /home/jhuang/mambaforge/etc/profile.d/conda.sh
    no change     /home/jhuang/mambaforge/etc/fish/conf.d/conda.fish
    no change     /home/jhuang/mambaforge/shell/condabin/Conda.psm1
    no change     /home/jhuang/mambaforge/shell/condabin/conda-hook.ps1
    no change     /home/jhuang/mambaforge/lib/python3.12/site-packages/xontrib/conda.xsh
    no change     /home/jhuang/mambaforge/etc/profile.d/conda.csh
    no change     /home/jhuang/.bashrc
    No action taken.
    WARNING conda.common.path.windows:_path_to(100): cygpath is not available, fallback to manual path conversion
    WARNING conda.common.path.windows:_path_to(100): cygpath is not available, fallback to manual path conversion
    Added mamba to /home/jhuang/.bashrc
    ==> For changes to take effect, close and re-open your current shell. <==
    Thank you for installing Mambaforge!
    
    Close your terminal window and open a new one, or run:
    #source ~/mambaforge/bin/activate
    conda --version
    mamba --version
    
    https://github.com/conda-forge/miniforge/releases
    Note
    
        * After installation, please make sure that you do not have the Anaconda default channels configured.
            conda config --show channels
            conda config --remove channels defaults
            conda config --add channels conda-forge
            conda config --show channels
            conda config --set channel_priority strict
            #conda clean --all
            conda config --remove channels biobakery
    
        * !!!!Do not install anything into the base environment as this might break your installation. See here for details.!!!!
    
    # --Deprecated method: mamba installing on conda--
    #conda install -n base --override-channels -c conda-forge mamba 'python_abi=*=*cp*'
    #    * Note that installing mamba into any other environment than base is not supported.
    #
    #conda activate base
    #conda install conda
    #conda uninstall mamba
    #conda install mamba

2: install required Tools on the mamba env

    * Sniffles2: Detect structural variants, including transposons, from long-read alignments.
    * RepeatModeler2: Identify and classify transposons de novo.
    * RepeatMasker: Annotate known transposable elements using transposon libraries.
    * SVIM: An alternative structural variant caller optimized for long-read sequencing, if needed.
    * SURVIVOR: Consolidate structural variants across samples for comparative analysis.

    mamba deactivate
    # Create a new conda environment
    mamba create -n transposon_long python=3.6 -y

    # Activate the environment
    mamba activate transposon_long

    mamba install -c bioconda sniffles
    mamba install -c bioconda repeatmodeler repeatmasker

    # configure repeatmasker database
    mamba info --envs
    cd /home/jhuang/mambaforge/envs/transposon_long/share/RepeatMasker

    #mamba install python=3.6
    mamba install -c bioconda svim
    mamba install -c bioconda survivor
  1. Test the installed tools

    # Check versions
    sniffles --version
    RepeatModeler -h
    RepeatMasker -h
    svim --help
    SURVIVOR --help
    mamba install -c conda-forge perl r
  2. Data Preparation

    Raw Signal Data: Nanopore devices generate electrical signal data as DNA passes through the nanopore.
    Basecalling: Tools like Guppy or Dorado are used to convert raw signals into nucleotide sequences (FASTQ files).
  3. Preprocessing

    Quality Filtering: Remove low-quality reads using tools like Filtlong or NanoFilt.
    Adapter Trimming: Identify and remove sequencing adapters with tools like Porechop.
  4. (Optional) Variant Calling for SNP and Indel Detection:

    Tools like Medaka, Longshot, or Nanopolish analyze the aligned reads to identify SNPs and small indels.
  5. (OFFICIAL STARTING POINT) Alignment and Structural Variant Calling: Tools such as Sniffles or SVIM detect large insertions, deletions, and other structural variants. 使用长读长测序工具如 SVIM 或 Sniffles 检测结构变异(e.g. 散在性重复序列)。

      #NOTE that the ./batch1_depth25/trycycler_WT/reads.fastq and F24A430001437_BACctmoD/BGI_result/Separate/${sample}/1.Cleandata/${sample}.filtered_reads.fq.gz are the same!
    
      # -- PREPARING the input fastq-data, merge the fastqz and move the top-directory
    
      # Under raw_data/no_sample_id/20250731_0943_MN45170_FBD12615_97f118c2/fastq_pass
      zcat ./barcode01/FBD12615_pass_barcode01_97f118c2_aa46ecf7_0.fastq.gz ./barcode01/FBD12615_pass_barcode01_97f118c2_aa46ecf7_1.fastq.gz ./barcode01/FBD12615_pass_barcode01_97f118c2_aa46ecf7_2.fastq.gz ./barcode01/FBD12615_pass_barcode01_97f118c2_aa46ecf7_3.fastq.gz ... | gzip > HD46_1.fastq.gz
      mv ./raw_data/no_sample_id/20250731_0943_MN45170_FBD12615_97f118c2/fastq_pass/HD46_1.fastq.gz ~/DATA/Data_Patricia_Transposon_2025
    
        #this are the corresponding sample names:
        #barcode 1: HD46-1
        #barcode 2: HD46-2
        #barcode 3: HD46-3
        #barcode 4: HD46-4
        mv barcode01.fastq.gz HD46_1.fastq.gz
        mv barcode02.fastq.gz HD46_2.fastq.gz
        mv barcode03.fastq.gz HD46_3.fastq.gz
        mv barcode04.fastq.gz HD46_4.fastq.gz
    
      # -- CALCULATE the coverages
        #!/bin/bash
    
        for bam in barcode*_minimap2.sorted.bam; do
            echo "Processing $bam ..."
            avg_cov=$(samtools depth -a "$bam" | awk '{sum+=$3; cnt++} END {if (cnt>0) print sum/cnt; else print 0}')
            echo -e "${bam}\t${avg_cov}" >> coverage_summary.txt
        done
    
      # ---- !!!! LOGIN the suitable environment !!!! ----
    
      mamba activate transposon_long
    
      # -- TODO: AFTERNOON_DEBUG_THIS: FAILED and not_USED: Alignment and Detect structural variants in each sample using SVIM which used aligner ngmlr or mimimap2
      #mamba install -c bioconda ngmlr
      mamba install -c bioconda svim
    
      # ---- Option_1: minimap2 (aligner) + SVIM (structural variant caller) --> SUCCESSFUL ----
      for sample in HD46_Ctrl HD46_1 HD46_2 HD46_3 HD46_4 HD46_5 HD46_6 HD46_7 HD46_8 HD46_13; do
          #INS,INV,DUP:TANDEM,DUP:INT,BND
          svim reads --aligner minimap2 --nanopore minimap2+svim_${sample}    ${sample}.fastq.gz CP020463.fasta  --cores 20 --types INS --min_sv_size 100 --sequence_allele --insertion_sequences --read_names;
      done
    
      #svim alignment svim_alignment_minmap2_1_re 1.sorted.bam CP020463_.fasta --types INS --sequence_alleles --insertion_sequences --read_names
    
      # ---- Option_2: minamap2 (aligner) + Sniffles2 (structural variant caller) --> SUCCESSFUL ----
      #Minimap2: A commonly used aligner for nanopore sequencing data.
      #    Align Long Reads to the WT Reference using Minimap2
      #sniffles -m WT.sorted.bam -v WT.vcf -s 10 -l 50 -t 60
      #  -s 20: Requires at least 20 reads to support an SV for reporting. --> 10
      #  -l 50: Reports SVs that are at least 50 base pairs long.
      #  -t 60: Uses 60 threads for faster processing.
      for sample in HD46_Ctrl HD46_1 HD46_2 HD46_3 HD46_4 HD46_5 HD46_6 HD46_7 HD46_8 HD46_13; do
          #minimap2 --MD -t 60 -ax map-ont CP020463.fasta ./batch1_depth25/trycycler_${sample}/reads.fastq | samtools sort -o ${sample}.sorted.bam
          minimap2 --MD -t 60 -ax map-ont CP020463.fasta ${sample}.fastq.gz | samtools sort -o ${sample}_minimap2.sorted.bam
          samtools index ${sample}_minimap2.sorted.bam
          sniffles -m ${sample}_minimap2.sorted.bam -v ${sample}_minimap2+sniffles.vcf -s 10 -l 50 -t 60
          #QUAL < 20 ||
          bcftools filter -e "INFO/SVTYPE != 'INS'" ${sample}_minimap2+sniffles.vcf > ${sample}_minimap2+sniffles_filtered.vcf
      done
    
        #Estimating parameter...
        #        Max dist between aln events: 44
        #        Max diff in window: 76
        #        Min score ratio: 2
        #        Avg DEL ratio: 0.0112045
        #        Avg INS ratio: 0.0364027
        #Start parsing... CP020463
        #                # Processed reads: 10000
        #                # Processed reads: 20000
        #        Finalizing  ..
        #Start genotype calling:
        #        Reopening Bam file for parsing coverage
        #        Finalizing  ..
        #Estimating parameter...
        #        Max dist between aln events: 28
        #        Max diff in window: 89
        #        Min score ratio: 2
        #        Avg DEL ratio: 0.013754
        #        Avg INS ratio: 0.17393
        #Start parsing... CP020463
        #                # Processed reads: 10000
        #                # Processed reads: 20000
        #                # Processed reads: 30000
        #                # Processed reads: 40000
    
        # Results:
        # * barcode01_minimap2+sniffles.vcf
        # * barcode01_minimap2+sniffles_filtered.vcf
        # * barcode02_minimap2+sniffles.vcf
        # * barcode02_minimap2+sniffles_filtered.vcf
        # * barcode03_minimap2+sniffles.vcf
        # * barcode03_minimap2+sniffles_filtered.vcf
        # * barcode04_minimap2+sniffles.vcf
        # * barcode04_minimap2+sniffles_filtered.vcf
    
      #ERROR: No MD string detected! Check bam file! Otherwise generate using e.g. samtools. --> No results!
      #for sample in barcode01 barcode02 barcode03 barcode04; do
      #    sniffles -m svim_reads_minimap2_${sample}/${sample}.fastq.minimap2.coordsorted.bam -v sniffles_minimap2_${sample}.vcf -s 10 -l 50 -t 60
      #    bcftools filter -e "INFO/SVTYPE != 'INS'" sniffles_minimap2_${sample}.vcf > sniffles_minimap2_${sample}_filtered.vcf
      #done
    
      # ---- Option_3: NGMLR (aligner) + SVIM (structural variant caller) --> SUCCESSFUL ----
      for sample in HD46_Ctrl HD46_1 HD46_2 HD46_3 HD46_4 HD46_5 HD46_6 HD46_7 HD46_8 HD46_13; do
          svim reads --aligner ngmlr --nanopore    ngmlr+svim_${sample}       ${sample}.fastq.gz CP020463.fasta  --cores 10;
      done
    
      # ---- Option_4: NGMLR (aligner) + sniffles (structural variant caller) --> SUCCESSFUL ----
      for sample in HD46_Ctrl HD46_1 HD46_2 HD46_3 HD46_4 HD46_5 HD46_6 HD46_7 HD46_8 HD46_13; do
          sniffles -m ngmlr+svim_${sample}/${sample}.fastq.ngmlr.coordsorted.bam -v ${sample}_ngmlr+sniffles.vcf -s 10 -l 50 -t 60
          bcftools filter -e "INFO/SVTYPE != 'INS'" ${sample}_ngmlr+sniffles.vcf > ${sample}_ngmlr+sniffles_filtered.vcf
      done
  6. Compare and integrate all results produced by minimap2+sniffles and ngmlr+sniffles, and check them each position in IGV!

        mv HD46_Ctrl_minimap2+sniffles_filtered.vcf HD46-Ctrl_minimap2+sniffles_filtered.vcf
        mv HD46_Ctrl_ngmlr+sniffles_filtered.vcf    HD46-Ctrl_ngmlr+sniffles_filtered.vcf
        mv HD46_1_minimap2+sniffles_filtered.vcf    HD46-1_minimap2+sniffles_filtered.vcf
        mv HD46_1_ngmlr+sniffles_filtered.vcf       HD46-1_ngmlr+sniffles_filtered.vcf
        mv HD46_2_minimap2+sniffles_filtered.vcf    HD46-2_minimap2+sniffles_filtered.vcf
        mv HD46_2_ngmlr+sniffles_filtered.vcf       HD46-2_ngmlr+sniffles_filtered.vcf
        mv HD46_3_minimap2+sniffles_filtered.vcf    HD46-3_minimap2+sniffles_filtered.vcf
        mv HD46_3_ngmlr+sniffles_filtered.vcf       HD46-3_ngmlr+sniffles_filtered.vcf
        mv HD46_4_minimap2+sniffles_filtered.vcf    HD46-4_minimap2+sniffles_filtered.vcf
        mv HD46_4_ngmlr+sniffles_filtered.vcf       HD46-4_ngmlr+sniffles_filtered.vcf
        mv HD46_5_minimap2+sniffles_filtered.vcf    HD46-5_minimap2+sniffles_filtered.vcf
        mv HD46_5_ngmlr+sniffles_filtered.vcf       HD46-5_ngmlr+sniffles_filtered.vcf
        mv HD46_6_minimap2+sniffles_filtered.vcf    HD46-6_minimap2+sniffles_filtered.vcf
        mv HD46_6_ngmlr+sniffles_filtered.vcf       HD46-6_ngmlr+sniffles_filtered.vcf
        mv HD46_7_minimap2+sniffles_filtered.vcf    HD46-7_minimap2+sniffles_filtered.vcf
        mv HD46_7_ngmlr+sniffles_filtered.vcf       HD46-7_ngmlr+sniffles_filtered.vcf
        mv HD46_8_minimap2+sniffles_filtered.vcf    HD46-8_minimap2+sniffles_filtered.vcf
        mv HD46_8_ngmlr+sniffles_filtered.vcf       HD46-8_ngmlr+sniffles_filtered.vcf
        mv HD46_13_minimap2+sniffles_filtered.vcf   HD46-13_minimap2+sniffles_filtered.vcf
        mv HD46_13_ngmlr+sniffles_filtered.vcf      HD46-13_ngmlr+sniffles_filtered.vcf
    
      conda activate plot-numpy1
      #python generate_common_vcf.py
      #mv common_variants.xlsx putative_transposons.xlsx
    
      # * Reads each of your VCFs.
      # * Filters variants → only keep those with FILTER == PASS.
      # * Compares the two aligner methods (minimap2+sniffles2 vs ngmlr+sniffles2) per sample.
      # * Keeps only variants that appear in both methods for the same sample.
      # * Outputs: An Excel file with the common variants and a log text file listing which variants were filtered out, and why (not_PASS or not_COMMON_in_two_VCF).
    
      #python generate_fuzzy_common_vcf_v1.py
      #Sample   PASS_minimap2   PASS_ngmlr  COMMON
      #  HD46-Ctrl_Ctrl 39  29  28
      #  HD46-1 39  32  29
      #  HD46-2 40  32  28
      #  HD46-3 38  30  27
      #  HD46-4 46  35  32
      #  HD46-5 40  35  31
      #  HD46-6 43  35  30
      #  HD46-7 40  33  28
      #  HD46-8 37  20  11
      #  HD46-13    39  38  27
    
    #Sample PASS_minimap2   PASS_ngmlr  COMMON_FINAL
    #HD46-Ctrl_Ctrl 39  29  6
    #HD46-1 39  32  8
    #HD46-2 40  32  8
    #HD46-3 38  30  6
    #HD46-4 46  35  8
    #HD46-5 40  35  9
    #HD46-6 43  35  10
    #HD46-7 40  33  8
    #HD46-8 37  20  4
    #HD46-13    39  38  5
    
    #!!!! Summarize the results of ngmlr+sniffles !!!!
    python merge_ngmlr+sniffles_filtered_results_and_summarize.py
    
    #!!!! Post-Processing !!!!
    #DELETE "2186168    N   

    . PASS” in Sheet HD46-13 and Summary #DELETE “2427785 N CGTCAGAATCGCTGTCTGCGTCCGAGTCACTGTCTGAGTCTGAATCACTATCTGCGTCTGAGTCACTGTCTG . PASS” due to “0/1:169:117” in HD46-13 and Summary #DELETE “2441640 N GCTCATTAAGAATCATTAAATTAC . PASS” due to 0/1:170:152 in HD46-13 and Summary

  7. Source code of merge_ngmlr+sniffles_filtered_results_and_summarize.py

    import os
    import pandas as pd
    
    # List all ngmlr VCF files
    vcf_files = sorted([f for f in os.listdir('.') if f.endswith('_ngmlr+sniffles_filtered.vcf')])
    
    log_lines = []
    df_list = []
    
    # Function to read VCF and filter PASS
    def read_vcf(vcf_path, log_lines, sample):
        variants = []
        with open(vcf_path) as f:
            for line in f:
                if line.startswith('#'):
                    continue
                parts = line.strip().split('\t')
                pos, ref, alt, qual, flt = parts[1], parts[3], parts[4], parts[5], parts[6]
                info = parts[7] if len(parts) > 7 else '.'
                fmt = parts[8] if len(parts) > 8 else '.'
                last_column = parts[9] if len(parts) > 9 else '.'  # Keep original column
                var_id = f"{pos}:{ref}>{alt}"
                if flt != 'PASS':
                    log_lines.append(f"{sample}\t{var_id}\tnot_PASS")
                    continue
                variants.append({
                    'POS': int(pos),
                    'REF': ref,
                    'ALT': alt,
                    'QUAL': qual,
                    'FILTER': flt,
                    'INFO': info,
                    'FORMAT': fmt,
                    sample: last_column,  # Use only genotype for individual sheets
                    f"{sample}_with_alt": alt  # Use only ALT sequence for summary
                })
        return pd.DataFrame(variants)
    
    # Read all VCFs
    sample_names = []
    sample_with_alt_columns = []
    for f in vcf_files:
        sample = os.path.basename(f).replace('_ngmlr+sniffles_filtered.vcf', '')
        sample_names.append(sample)
        sample_with_alt_columns.append(f"{sample}_with_alt")
        df = read_vcf(f, log_lines, sample)
        df_list.append(df)
    
    # Merge all variants into one DataFrame
    all_variants = pd.concat(df_list, ignore_index=True)
    
    # Fill missing sample columns with hyphen for summary
    for sample in sample_names:
        if sample not in all_variants.columns:
            all_variants[sample] = ''
        if f"{sample}_with_alt" not in all_variants.columns:
            all_variants[f"{sample}_with_alt"] = '-'
    
    # Pivot table for summary using exact POS, using columns with ALT
    summary_df = all_variants.groupby(['POS', 'REF'])[sample_with_alt_columns].first().reset_index()
    
    # Rename columns in summary to remove '_with_alt' suffix
    summary_df.columns = ['POS', 'REF'] + sample_names
    
    # Replace NaN or empty strings with hyphen in sample columns
    summary_df[sample_names] = summary_df[sample_names].fillna('-').replace('', '-')
    
    # Count how many samples have a non-hyphen value
    summary_df['Count'] = summary_df[sample_names].apply(lambda row: sum(val != '-' for val in row), axis=1)
    
    # Save Excel with individual sheets and summary
    writer = pd.ExcelWriter('merged_ngmlr+sniffles_variants.xlsx', engine='openpyxl')
    
    # Save individual sample sheets
    for df in df_list:
        sheet_name = df.columns[-2]  # Use sample name (not the _with_alt column)
        # Select only relevant columns for individual sheets (exclude _with_alt)
        df = df[[col for col in df.columns if not col.endswith('_with_alt')]]
        df.to_excel(writer, sheet_name=sheet_name, index=False)
    
    # Save summary sheet
    summary_df.to_excel(writer, sheet_name='Summary', index=False)
    writer.close()
    
    # Write log
    with open('ngmlr_filtering_log.txt', 'w') as logf:
        logf.write('Sample\tVariant\tReason\n')
        for line in log_lines:
            logf.write(line + '\n')
    
    print('Done: merged_ngmlr+sniffles_variants.xlsx with ALT sequences or hyphens in summary and genotype-only in individual sheets.')
  8. ———————– END of the transposon calculation. The following steps (e.g. assembly based on the long-reads is not necessary for the transposon analysis) —————————-

  9. (NOT_USED) Filtering low-complexity insertions using RepeatMasker (TODO: how to use RepeatModeler to generate own lib?)

      python vcf_to_fasta.py variants.vcf variants.fasta
      #python filter_low_complexity.py variants.fasta filtered_variants.fasta retained_variants.fasta
      #Using RepeatMasker to filter the low-complexity fasta, the used h5 lib is
      /home/jhuang/mambaforge/envs/transposon_long/share/RepeatMasker/Libraries/Dfam.h5    #1.9G
      python /home/jhuang/mambaforge/envs/transposon_long/share/RepeatMasker/famdb.py -i /home/jhuang/mambaforge/envs/transposon_long/share/RepeatMasker/Libraries/Dfam.h5 names 'bacteria' | head
      Exact Matches
      =============
      2 bacteria (blast name), Bacteria 
    (scientific name), eubacteria (genbank common name), Monera (in-part), Procaryotae (in-part), Prokaryota (in-part), Prokaryotae (in-part), prokaryote (in-part), prokaryotes (in-part) Non-exact Matches ================= 1783272 Terrabacteria group (scientific name) 91061 Bacilli (scientific name), Bacilli Ludwig et al. 2010 (authority), Bacillus/Lactobacillus/Streptococcus group (synonym), Firmibacteria (synonym), Firmibacteria Murray 1988 (authority) 1239 Bacillaeota (synonym), Bacillaeota Oren et al. 2015 (authority), Bacillota (synonym), Bacillus/Clostridium group (synonym), clostridial firmicutes (synonym), Clostridium group firmicutes (synonym), Firmacutes (synonym), firmicutes (blast name), Firmicutes (scientific name), Firmicutes corrig. Gibbons and Murray 1978 (authority), Low G+C firmicutes (synonym), low G+C Gram-positive bacteria (common name), low GC Gram+ (common name) Summary of Classes within Firmicutes: * Bacilli (includes many common pathogenic and non-pathogenic Gram-positive bacteria, taxid=91061) * Bacillus (e.g., Bacillus subtilis, Bacillus anthracis) * Staphylococcus (e.g., Staphylococcus aureus, Staphylococcus epidermidis) * Streptococcus (e.g., Streptococcus pneumoniae, Streptococcus pyogenes) * Listeria (e.g., Listeria monocytogenes) * Clostridia (includes many anaerobic species like Clostridium and Clostridioides) * Erysipelotrichia (intestinal bacteria, some pathogenic) * Tissierellia (less-studied, veterinary relevance) * Mollicutes (cell wall-less, includes Mycoplasma species) * Negativicutes (includes some Gram-negative, anaerobic species) RepeatMasker -species Bacilli -pa 4 -xsmall variants.fasta python extract_unmasked_seq.py variants.fasta.masked unmasked_variants.fasta #bcftools filter -i ‘QUAL>30 && INFO/SVLEN>100’ variants.vcf -o filtered.vcf # #bcftools view -i ‘SVTYPE=”INS”‘ variants.vcf | bcftools query -f ‘%CHROM\t%POS\t%REF\t%ALT\t%INFO\n’ > insertions.txt #mamba install -c bioconda vcf2fasta #vcf2fasta variants.vcf -o insertions.fasta #grep “SEQS” variants.vcf | awk ‘{ print $1, $2, $4, $5, $8 }’ > insertions.txt #python3 filtering_low_complexity.py # #vcftools –vcf input.vcf –recode –out filtered_output –minSVLEN 100 #bcftools filter -e ‘INFO/SEQS ~ “^(G+|C+|T+|A+){4,}”‘ variants.vcf -o filtered.vcf # — calculate the percentage of reads To calculate the percentage of reads that contain the insertion from the VCF entry, use the INFO and FORMAT fields provided in the VCF record. Step 1: Extract Relevant Information In the provided VCF entry: RE (Reads Evidence): 733 – the total number of reads supporting the insertion. GT (Genotype): 1/1 – this indicates a homozygous insertion, meaning all reads covering this region are expected to have the insertion. AF (Allele Frequency): 1 – a 100% allele frequency, indicating that every read in this sample supports the insertion. DR (Depth Reference): 0 – the number of reads supporting the reference allele. DV (Depth Variant): 733 – the number of reads supporting the variant allele (insertion). Step 2: Calculate Percentage of Reads Supporting the Insertion Using the formula: Percentage of reads with insertion=(DVDR+DV)×100 Percentage of reads with insertion=(DR+DVDV​)×100 Substitute the values: Percentage=(7330+733)×100=100% Percentage=(0+733733​)×100=100% Conclusion Based on the VCF record, 100% of the reads support the insertion, indicating that the insertion is fully present in the sample (homozygous insertion). This is consistent with the AF=1 and GT=1/1 fields. * In your VCF file generated by Sniffles, the REF=N in the results has a specific meaning: * In a standard VCF, the REF field usually contains the reference base(s) at the variant position. * For structural variants (SVs), especially insertions, there is no reference sequence replaced; the insertion occurs between reference bases. * Therefore, Sniffles uses N as a placeholder in the REF field to indicate “no reference base replaced”. * The actual inserted sequence is then stored in the ALT field.
  10. Why some records have UNRESOLVED in the FILTER field in the Excel output.

    1. Understanding the format
    
        The data appears to be structural variant (SV) calls from Sniffles, probably in a VCF-like tabular format exported to Excel:
    
            * gi|1176884116|gb|CP020463.1| → reference sequence
            * Positions: 1855752 and 2422820
            * N → insertion event
            * SVLEN=999 → size of the insertion
            * AF → allele frequency
            * GT:DR:DV → genotype, depth reference, depth variant (1/1:0:678, example values for a PASS variant)
            * FILTER → whether the variant passed filters (UNRESOLVED means it didn’t pass)
    
    2. What UNRESOLVED usually means
    
        In Sniffles:
    
        * UNRESOLVED is assigned to SVs when the tool cannot confidently resolve the exact sequence or breakpoint.
        * Reasons include:
            - Low read support (RE, DV) relative to the expected coverage
            - Ambiguous alignment at repetitive regions
            - Conflicting strand or orientation signals
            - Allele frequency inconsistent with expectations
    
    3. Examine your two records
    
        First record
    
            POS: 1855752
            SVTYPE: INS
            SVLEN: 999
            RE: 68
            AF: 1
            GT: 1/1
            FILTER: UNRESOLVED
    
        Observations:
    
        * AF = 1 → allele frequency 100%, homozygous insertion
        * RE = 68 → 68 reads support the variant, decent coverage
        * Still UNRESOLVED → likely because Sniffles could not resolve the inserted sequence precisely; sometimes long insertions in repetitive regions are hard to reconstruct fully even with good read support.
    
        Second record
    
            POS: 2422820
            SVTYPE: INS
            SVLEN: 999
            RE: 22
            AF: 0.025522
            GT: 0/0
            FILTER: UNRESOLVED
    
        Observations:
    
        * AF = 0.0255 → very low allele frequency (~2.5%)
        * RE = 22, DR = 840 → very low variant reads vs reference
        * GT = 0/0 → homozygous reference
        * Sniffles marks it UNRESOLVED because the variant is essentially noise, not confidently detected.
    
    4. Key difference between the two
        Feature First record    Second record
        Allele frequency (AF)   1 (high)    0.0255 (very low)
        Variant reads (RE)  68  22
        Genotype (GT)   1/1 0/0
        Reason for UNRESOLVED   Unresolvable inserted sequence
    
    ✅ 5. Conclusion
    
        * Sniffles marks a variant as UNRESOLVED when the SV cannot be confidently characterized.
        * Even if there is good read support (first record), complex insertions can’t always be reconstructed fully.
        * Very low allele frequency (second record) also triggers UNRESOLVED because the signal is too weak compared to background noise.
        * Essentially: “UNRESOLVED” ≠ bad data, it’s just unresolved uncertainty.
  11. (NOT_SURE_HOW_TO_USE) Polishing of assembly: Use tools like Medaka to refine variant calls by leveraging consensus sequences derived from nanopore data.

      mamba install -c bioconda medaka
      medaka-consensus -i aligned_reads.bam -r reference.fasta -o polished_output -t 4
  12. Compare Insertions Across Samples

    Merge Variants Across Samples: Use SURVIVOR to merge and compare the detected insertions in all samples against the WT:
    
    SURVIVOR merge input_vcfs.txt 1000 1 1 1 0 30 merged.vcf
    
        Input: List of VCF files from Sniffles2.
        Output: A consolidated VCF file with shared and unique variants.
    
    Filter WT Insertions:
    
        Identify transposons present only in samples 1–9 by subtracting WT variants using bcftools:
    
            bcftools isec WT.vcf merged.vcf -p comparison_results
  13. Validate and Visualize

    Visualize with IGV: Use IGV to inspect insertion sites in the alignment and confirm quality.
    
    igv.sh
    
    Validate Findings:
        Perform PCR or additional sequencing for key transposon insertion sites to confirm results.
  14. Alternatives to TEPID for Long-Read Data

    If you’re looking for transposon-specific tools for long reads:
    
        REPET: A robust transposon annotation tool compatible with assembled genomes.
        EDTA (Extensive de novo TE Annotator):
            A pipeline to identify, classify, and annotate transposons.
            Works directly on your assembled genomes.
    
            perl EDTA.pl --genome WT.fasta --type all
  15. The WT.vcf file in the pipeline is generated by detecting structural variants (SVs) in the wild-type (WT) genome aligned against itself or using it as a baseline reference. Here’s how you can generate the WT.vcf:

    Steps to Generate WT.vcf
    1. Align WT Reads to the WT Reference Genome
    
    The goal here is to create an alignment of the WT sequencing data to the WT reference genome to detect any self-contained structural variations, such as native insertions, deletions, or duplications.
    
    Command using Minimap2:
    
    minimap2 -ax map-ont WT.fasta WT_reads.fastq | samtools sort -o WT.sorted.bam
    
    Index the BAM file:
    
    samtools index WT.sorted.bam
    
    2. Detect Structural Variants with Sniffles2
    
    Run Sniffles2 on the WT alignment to call structural variants:
    
    sniffles --input WT.sorted.bam --vcf WT.vcf
    
    This step identifies:
    
        Native transposons and insertions present in the WT genome.
        Other structural variants that are part of the reference genome or sequencing artifacts.
    
    Key parameters to consider:
    
        --min_support: Adjust based on your WT sequencing coverage.
        --max_distance: Define proximity for merging variants.
        --min_length: Set a minimum SV size (e.g., >50 bp for transposons).
  16. Clean and Filter the WT.vcf, Variant Filtering: Remove low-confidence variants based on read depth, quality scores, or allele frequency.

    To ensure the WT.vcf only includes relevant transposons or SVs:
    
        Use bcftools or similar tools to filter out low-confidence variants:
    
        bcftools filter -e "QUAL < 20 || INFO/SVTYPE != 'INS'" WT.vcf > WT_filtered.vcf
        bcftools filter -e "QUAL < 1 || INFO/SVTYPE != 'INS'" 1_.vcf > 1_filtered_.vcf
  17. NOTE that in this pipeline, the WT.fasta (reference genome) is typically a high-quality genome sequence from a database or a well-annotated version of your species’ genome. It is not assembled from the WT.fastq sequencing reads in this context. Here’s why:

    Why Use a Reference Genome (WT.fasta) from a Database?
    
        Higher Quality and Completeness:
            Database references (e.g., NCBI, Ensembl) are typically well-assembled, highly polished, and annotated. They serve as a reliable baseline for variant detection.
    
        Consistency:
            Using a standard reference ensures consistent comparisons across your WT and samples (1–9). Variants detected will be relative to this reference, not influenced by possible assembly errors.
    
        Saves Time:
            Assembling a reference genome from WT reads requires significant computational effort. Using an existing reference streamlines the analysis.
    
    Alternative: Assembling WT from FASTQ
    
    If you don’t have a high-quality reference genome (WT.fasta) and must rely on your WT FASTQ reads:
    
        Assemble the genome from your WT.fastq:
            Use long-read assemblers like Flye, Canu, or Shasta to create a draft genome.
    
        flye --nano-raw WT.fastq --out-dir WT_assembly --genome-size 
    Polish the assembly using tools like Racon (with the same reads) or Medaka for higher accuracy. Use the assembled and polished genome as your WT.fasta reference for further steps. Key Takeaways: If you have access to a reliable, high-quality reference genome, use it as the WT.fasta. Only assemble WT.fasta from raw reads (WT.fastq) if no database reference is available for your organism.
  18. Annotate Transposable Elements: Tools like ANNOVAR or SnpEff provide functional insights into the detected variants.

    # -- (successful!) MANUALLY Search for all found insertion sequences at https://tncentral.ncc.unesp.br/blast/ !
    # Or use the program available at https://github.com/danillo-alvarenga/tncomp_finder if there are numerous matches.
    #https://tncentral.ncc.unesp.br/report/te/Tn551-Y13600.1
    
    # -- (failed!) try TEPID for annotation
    mamba install tepid=0.10 -c bioconda
    #(tepid_env)
    for sample in WT 1 2 3 4 5 7 8 9 10; do
        tepid-map-se -x CP020463 -p 10 -n ${sample}_tepid -q  ../batch1_depth25/trycycler_${sample}/reads.fastq;
        tepid-discover -k -i -p 10 -n ${sample}_tepid -c ${sample}_tepid --se;
    done
    
    tepid-discover -k -i -p 10 -n 1_tepid -c 1.sorted.bam --se;
    
    tepid-refine [-h] [--version] [-k] [-i INSERTIONS] [-d DELETIONS]
                [-p PROC] -t TE -n NAME -c CONC -s SPLIT -a AL
    
    # -- (failed!) try EDTA for annotation
    https://github.com/oushujun/EDTA
    (transposon_long) mamba install -c conda-forge -c bioconda edta
    mamba install bioconda::rmblast  # cd RepeatMasker; ./configure
    EDTA.pl --genome CP020463.fasta --species others --threads 40
    
    For general-purpose TE annotation: EDTA, RepeatMasker, or RepeatScout are your best options.
    For de novo repeat identification: RepeatScout is highly effective.
    For LTR retrotransposons: Use LTR_retriever.
    For bacterial-specific annotations: Transposome, TEfinder, and ISfinder can be useful.
  19. Validation: Cross-validate with short-read sequencing data if available.

  20. (Optional) Assembly the nanopore-sequencing using

    1. merge and prepare fastq.gz
    
    2. calcuclate the precentage of coding DNA: https://www.ncbi.nlm.nih.gov/nuccore/CP020463 with additional plasmid.
    
        * Average gene length: 870.4 bp
        * Total coding region length: 2056168 bp
        * Percentage of coding DNA = (Total Coding Region Length / Total Genome Length) × 100 = 2056168 bp / 2454929 bp = 83.8%
    
    3. Prepare the fastq.gz
    
        conda activate /home/jhuang/miniconda3/envs/trycycler  # under jhuang@hamm (10.169.63.113).
    
        rsync -a -P *.fastq.gz jhuang@10.169.63.113:/home/jhuang/DATA/Data_Patricia_Transposon_2025/
        for sample in barcode01 barcode02 barcode03 barcode04  HD46_Ctrl HD46_5 HD46_6 HD46_7 HD46_8 HD46_13; do
            mkdir trycycler_${sample};
            mv ${sample}.fastq.gz trycycler_${sample}/reads.fastq.gz;
            gunzip trycycler_${sample}/reads.fastq.gz;
        done
        #mkdir batch3;
        #cd batch3;
        #for sample in WT 1 2 3 4 5 7 8 9 10; do
        #    mkdir trycycler_${sample};
        #    cp ${sample}_nanopore/${sample}.fastq.gz trycycler_${sample}/reads.fastq.gz;
        #    gunzip trycycler_${sample}/reads.fastq.gz;
        #done
    
    4. Running separate assemblies (6x4 times: canu, flye, miniasm_and_minipolish, necat, nextdenovo, raven) using trycycler_assembly_extra-thorough.sh (under the trycycler environment running the following steps)
            # batch1: min_read_cov=25; batch2: min_read_cov=50; batch3: min_read_cov=100 (if necessary on the monday!)
            cp ../Data_PaulBongarts_S.epidermidis_HDRNA/trycycler_*.sh ./
            #for sample in trycycler_HDRNA_10 trycycler_HDRNA_13; do
            for sample in barcode01 barcode02 barcode03 barcode04  HD46_Ctrl HD46_5 HD46_6 HD46_7 HD46_8 HD46_13; do
                cd trycycler_${sample};
                ../trycycler_assembly_extra-thorough.sh
                cd ..;
            done
    
    # END!
    #TODO: upload the nanopore-sequencing data to NCBI for the HDRNA_10 and HDRNA_13 to the correspoinding project.
    
    (bengal3_ac3) jhuang@WS-2290C:~/DATA/Data_PaulBongarts_S.epidermidis_HDRNA/trycycler_HDRNA_10/assemblies$ mlst assembly_02.fasta
    assembly_02.fasta       sepidermidis    87      arcC(7) aroE(1) gtr(1)  mutS(2) pyrR(2) tpiA(1) yqiL(1)
    [15:32:46] If you like MLST, you're absolutely going to love wgMLST!
    [15:32:46] Done.
    (bengal3_ac3) jhuang@WS-2290C:~/DATA/Data_PaulBongarts_S.epidermidis_HDRNA/trycycler_HDRNA_10/assemblies$ mlst assembly_20.fasta
    
    assembly_20.fasta       sepidermidis    87      arcC(7) aroE(1) gtr(1)  mutS(2) pyrR(2) tpiA(1) yqiL(1)
    [15:33:01] You can use --label XXX to replace an ugly filename in the output.
    [15:33:01] Done.
    
    (bengal3_ac3) jhuang@WS-2290C:/mnt/md1/DATA/Data_PaulBongarts_S.epidermidis_HDRNA/trycycler_HDRNA_13/assemblies$ mlst assembly_02.fasta
    assembly_02.fasta       sepidermidis    5       arcC(1) aroE(1) gtr(1)  mutS(2) pyrR(2) tpiA(1) yqiL(1)
    
    (bengal3_ac3) jhuang@WS-2290C:/mnt/md1/DATA/Data_PaulBongarts_S.epidermidis_HDRNA/trycycler_HDRNA_13/assemblies$ mlst assembly_08.fasta
    
    assembly_08.fasta       sepidermidis    5       arcC(1) aroE(1) gtr(1)  mutS(2) pyrR(2) tpiA(1) yqiL(1)
    [15:38:22] Remember that --minscore is only used when using automatic scheme detection.
    [15:38:22] Done.
    (bengal3_ac3) jhuang@WS-2290C:/mnt/md1/DATA/Data_PaulBongarts_S.epidermidis_HDRNA/trycycler_HDRNA_13/assemblies$ mlst assembly_14.fasta
    assembly_14.fasta       sepidermidis    5       arcC(1) aroE(1) gtr(1)  mutS(2) pyrR(2) tpiA(1) yqiL(1)
    [15:38:50] Thanks for using mlst, I hope you found it useful.
    [15:38:50] Done.
    (bengal3_ac3) jhuang@WS-2290C:/mnt/md1/DATA/Data_PaulBongarts_S.epidermidis_HDRNA/trycycler_HDRNA_13/assemblies$ mlst assembly_20.fasta
    assembly_20.fasta       sepidermidis    5       arcC(1) aroE(1) gtr(1)  mutS(2) pyrR(2) tpiA(1) yqiL(1)
    [15:38:54] If you like MLST, you're going to absolutely love cgMLST!
    [15:38:54] Done.
    
            #- under the directory batch3
            #for sample in trycycler_WT trycycler_1 trycycler_2 trycycler_3 trycycler_4 trycycler_5 trycycler_7 trycycler_8 trycycler_9 trycycler_10; do
            #    cd ${sample};
            #    ../trycycler_assembly_extra-thorough_threads5_cov100.sh;
            #    cd ..;
            #done
    
            #if ERROR, running separate assembly-methods raven and canu
            #for sample in trycycler_WT trycycler_1 trycycler_2 trycycler_3 trycycler_4 trycycler_5 trycycler_7 trycycler_8 trycycler_9 trycycler_10; do
            #    cd ${sample};
            #    ../trycycler_assembly_extra-thorough_raven.sh;
            #    cd ..;
            #done
            #
            #for sample in trycycler_WT trycycler_1 trycycler_2 trycycler_3 trycycler_4 trycycler_5 trycycler_7 trycycler_8 trycycler_9 trycycler_10; do
            #    cd ${sample};
            #    ../trycycler_assembly_extra-thorough_canu.sh;
            #    cd ..;
            #done
    
    5. trycycler cluster
    
            for sample in trycycler_5 trycycler_7 trycycler_8 trycycler_9 trycycler_10; do
            for sample in trycycler_WT trycycler_1 trycycler_2 trycycler_3 trycycler_4; do
                cd ${sample};
                rm -rf trycycler
                trycycler cluster --threads 10 --assemblies assemblies/*.fasta --reads reads.fastq --out_dir trycycler;
                cd ..;
            done
    
    6. trycycler reconcile
    
            cd trycycler_WT
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            mkdir trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/C_utg000001c.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/K_ctg000000.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/S_tig00000001.fasta trycycler/cluster_001/1_contigs_removed
    
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
                # -- under batch3 --
                176K Nov  5 12:38 P_bctg00000001.fasta
                122K Nov  5 12:38 D_bctg00000001.fasta
                95K Nov  5 12:38 J_bctg00000001.fasta
                78K Nov  5 12:38 J_bctg00000002.fasta
                #--> Error: unable to find a suitable common sequence
    
                69K Nov  5 17:24 G_tig00000004.fasta
                66K Nov  5 17:24 S_tig00000004.fasta
                66K Nov  5 17:24 M_tig00000004.fasta
                65K Nov  5 17:24 A_tig00000005.fasta
                #--> Error: unable to find a suitable common sequence
                #If repeat M_tig00000004.fasta twice, resulting in the following error: Circularising M_tig00000004:
                #  using S_tig00000004:
                #    unable to circularise: M_tig00000004's start and end were found in multiple places in S_tig00000004
                #Error: failed to circularise sequence M_tig00000004 because its start/end sequences were found in multiple ambiguous places in other sequences. #This is likely because M_tig00000004 starts/ends in a repetitive region. You can either manually repair its circularisation (and ensure it does #not start/end in a repetitive region) or exclude the sequence altogether and try again.
    
                47K Nov  5 17:24 V_bctg00000001.fasta
                45K Nov  5 17:24 C_utg000002c.fasta
                #Error: unable to find a suitable common sequence
    
                34K Nov  5 17:24 U_utg000004c.fasta
                34K Nov  5 17:24 N_contig_2.fasta
                34K Nov  5 17:24 T_contig_2.fasta
                #Error: unable to find a suitable common sequence
    
                23K Nov  5 17:24 I_utg000003c.fasta
                22K Nov  5 17:24 B_contig_2.fasta
                22K Nov  5 17:24 H_contig_2.fasta
                #Error: unable to find a suitable common sequence
    
                13K Nov  5 17:24 G_tig00000006.fasta
                12K Nov  5 17:24 M_tig00000003.fasta
                12K Nov  5 17:24 O_utg000002c.fasta
                12K Nov  5 17:24 S_tig00000003.fasta
                11K Nov  5 17:24 A_tig00000004.fasta
                #trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002 --max_length_diff 1.2 --max_trim_seq_percent 20.0
                #--> SUCCESSFULLY saving sequences to file: trycycler/cluster_002/2_all_seqs.fasta
    
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004 --max_length_diff 1.3 --max_trim_seq_percent 30.0
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_005 #Error: two or more input contigs are required
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_006 #Error: two or more input contigs are required
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_007 #Error: two or more input contigs are required
    
            cd ../trycycler_1
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            mkdir trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/I_utg000001l.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/K_ctg000000.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/S_tig00000001.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/W_ctg000000.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/A_tig00000001.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/U_utg000001c.fasta trycycler/cluster_001/1_contigs_removed
    
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
            #TODO_TOMORROW_HERE!
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003 --max_length_diff 1.7 --max_trim_seq_percent 70.0
            #Error: failed to circularise sequence I_utg000002l because its end could not be found in other sequences.
            (NOTE) using the plasmid from other isolate to help the cut of the sequence.
                #cp ~/DATA/Data_Patricia_Transposon/batch3/trycycler_WT/trycycler/cluster_004/7_final_consensus.fasta .
                #cat *.fasta > all.fasta
                #mafft --clustalout --adjustdirection all.fasta > all.aln
            cluster_004_con -------------------------------------------------------tatga
            I_utg000002l    agaatcagaattaggcgcataatttacaggaggtttgattatggctaagaaaaaatatga
            O_utg000002l    agaatcagaattaggcgcataatttacaggaggtttgattatggctaagaaaaaatatga
                                                                                *****
            cluster_004_con gcagaatcagaattaggcgcataatttacaggaggtttgattatggctaagaaaaaa---
            I_utg000002l    gcagaatcagaattaggcgcataatttacaggaggtttgattatggctaagaaaaatatg
            O_utg000002l    gcagaatcagaattaggcgcataatttacaggaggtttgattatggctaagaaaaatatg
                            ********************************************************
    
            grep "I_utg000002l" all.a_ > I_utg000002l.fasta
            grep "O_utg000002l" all.a_ > O_utg000002l.fasta
            cut -d' ' -f5 I_utg000002l.fasta > I_utg000002l_.fasta
            cut -d' ' -f5 O_utg000002l.fasta > O_utg000002l_.fasta
            sed 's/-//g' I_utg000002l_.fasta > I_utg000002l__.fasta
            sed 's/-//g' O_utg000002l_.fasta > O_utg000002l__.fasta
            seqtk seq I_utg000002l__.fasta -l 80 > I_utg000002l___.fasta
            seqtk seq O_utg000002l__.fasta -l 80 > O_utg000002l___.fasta
    
            #Cut two files Manually with the sequence: AGAATCAGAATTAGGCGCATAATTTACAGGAGGTTTGATTATGGCTAAGAAAAA
            cat I_utg000002l___.fasta O_utg000002l___.fasta > 2_all_seqs.fasta
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004 #Error: two or more input contigs are required
    
            cd ../trycycler_2
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            mkdir trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/O_bctg00000000.fasta trycycler/cluster_001/1_contigs_removed
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004
    
            cd ../trycycler_3
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            mkdir trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/E_ctg000000.fasta trycycler/cluster_001/1_contigs_removed
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004
    
            cd ../trycycler_4
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_001
            mkdir trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/C_utg000001l.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/E_ctg000000.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/F_Utg670.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/V_bctg00000000.fasta trycycler/cluster_001/1_contigs_removed
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_004
    
            cd ../trycycler_5
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_001
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 5 --reads reads.fastq --cluster_dir trycycler/cluster_004
    
            cd ../trycycler_7
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            mkdir trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/C_utg000001l.fasta trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/D_bctg00000000.fasta trycycler/cluster_001/1_contigs_removed
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_005
    
            cd ../trycycler_8
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            mkdir trycycler/cluster_001/1_contigs_removed
            mv trycycler/cluster_001/1_contigs/M_utg000001l.fasta trycycler/cluster_001/1_contigs_removed
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_005
    
            cd ../trycycler_9
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_005
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_006
    
            cd ../trycycler_10
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_001
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_002
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_003
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_004
            trycycler reconcile --threads 55 --reads reads.fastq --cluster_dir trycycler/cluster_005
    
            #Nachmachen: for sample in trycycler_9 trycycler_10; do
            cd ${sample};
            ../trycycler_assembly_extra-thorough_canu.sh;
            cd ..;
            done
    
    7. (optional) map the circular assemblies to plasmid databases
            #bzip2 -d plsdb.fna.bz2
            #makeblastdb -in plsdb.fna -dbtype nucl
            #blastn -db plsdb.fna -query all.fasta -evalue 1e-50 -num_threads 15 -outfmt 6 -strand both -max_target_seqs 1 > all_on_plsdb.blastn
    
    8. trycycler msa
    
            trycycler msa --threads 55 --cluster_dir trycycler/cluster_001
            trycycler msa --threads 55 --cluster_dir trycycler/cluster_002
            trycycler msa --threads 55 --cluster_dir trycycler/cluster_003
            trycycler msa --threads 55 --cluster_dir trycycler/cluster_004
            trycycler msa --threads 55 --cluster_dir trycycler/cluster_005
            #--> When finished, Trycycler reconcile will make a 3_msa.fasta file in the cluster directory
    
    9. trycycler partition
    
            #generate 4_reads.fastq for each contig!
            trycycler partition --threads 55 --reads reads.fastq --cluster_dirs trycycler/cluster_*
            #trycycler partition --threads 55 --reads reads.fastq --cluster_dirs trycycler/cluster_001 trycycler/cluster_002 trycycler/cluster_003
            trycycler partition --threads 55 --reads reads.fastq --cluster_dirs trycycler/cluster_003
    
    10. trycycler consensus
    
            trycycler consensus --threads 55 --cluster_dir trycycler/cluster_001
            trycycler consensus --threads 55 --cluster_dir trycycler/cluster_002
            trycycler consensus --threads 55 --cluster_dir trycycler/cluster_003
            trycycler consensus --threads 55 --cluster_dir trycycler/cluster_004
            trycycler consensus --threads 55 --cluster_dir trycycler/cluster_005
            #!!NOTE that we take the isolates of HD05_2_K5 and HD05_2_K6 assembled by Unicycler instead of Trycycler!!
            # TODO (TODAY), generate the 3 datasets below!
            # TODO (IMPORTANT): write a Email to Holger, say the short sequencing of HD5_2 is not correct, since the 3 datasets! However, the MTxxxxxxx is confirmed not in K5 and K6!
            TODO: variant calling needs the short-sequencing, they are not dorable without the correct short-reads! resequencing? It is difficult to call variants only from long-reads since too much errors in long-reads!
            #TODO: check the MT sequence if in the isolates, more deteiled annotations come late!
            #II. Comparing the results of Trycycler with Unicycler.
            #III. Eventually add the plasmids assembled from unicycler to the final results. E.g. add the 4 plasmids to K5 and K6
    
    11. Polishing after Trycycler
    
            #1. Oxford Nanopore sequencer (Ignored due to the samtools version incompatibility!)
            # for c in trycycler/cluster_*; do
            #     medaka_consensus -i "$c"/4_reads.fastq -d "$c"/7_final_consensus.fasta -o "$c"/medaka -m r941_min_sup_g507 -t 12
            #     mv "$c"/medaka/consensus.fasta "$c"/8_medaka.fasta
            #     rm -r "$c"/medaka "$c"/*.fai "$c"/*.mmi  # clean up
            # done
            # cat trycycler/cluster_*/8_medaka.fasta > trycycler/consensus.fasta
            #2. Short-read polishing
            #---- 5179_R1 (2) ----
            #  mean read depth: 205.8x
            #  188 bp have a depth of zero (99.9924% coverage)
            #  355 positions changed (0.0144% of total positions)
            #  estimated pre-polishing sequence accuracy: 99.9856% (Q38.42)
            #Step 1: read QC
            fastp --in1 ../../s-epidermidis-5179-r1_R1.fastq.gz --in2 ../../s-epidermidis-5179-r1_R2.fastq.gz --out1 1.fastq.gz --out2 2.fastq.gz --unpaired1 u.fastq.gz --unpaired2 u.fastq.gz
            #Step 2: Polypolish
            for cluster in cluster_001 cluster_002; do
            bwa index ${cluster}/7_final_consensus.fasta
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 1.fastq.gz > ${cluster}/alignments_1.sam
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 2.fastq.gz > ${cluster}/alignments_2.sam
            polypolish polish ${cluster}/7_final_consensus.fasta ${cluster}/alignments_1.sam ${cluster}/alignments_2.sam > ${cluster}/polypolish.fasta
            done
            #Step 3: POLCA
            for cluster in cluster_001 cluster_002; do
            cd ${cluster}
            polca.sh -a polypolish.fasta -r "../../../s-epidermidis-5179-r1_R1.fastq.gz ../../../s-epidermidis-5179-r1_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 37
            #Insertion/Deletion Errors: 2
            #Assembly Size: 2470001
            #Consensus Quality: 99.9984
            #Substitution Errors: 4
            #Insertion/Deletion Errors: 0
            #Assembly Size: 17748
            #Consensus Quality: 99.9775
            #Step 4: (optional) more rounds and/or other polishers
            #After one round of Polypolish and one round of POLCA, your assembly should be in very good shape!
            #However, there may still be a few lingering errors. You can try running additional rounds of Polypolish or POLCA to see if they make any more changes.
            for cluster in cluster_001 cluster_002; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa -r "../../../s-epidermidis-5179-r1_R1.fastq.gz ../../../s-epidermidis-5179-r1_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            Substitution Errors: 13
            Insertion/Deletion Errors: 0
            Assembly Size: 2470004
            Consensus Quality: 99.9995
            Substitution Errors: 0
            Insertion/Deletion Errors: 0
            Assembly Size: 17748
            Consensus Quality: 100
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa.PolcaCorrected.fa -r "../../../s-epidermidis-5179-r1_R1.fastq.gz ../../../s-epidermidis-5179-r1_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2470004
            #Consensus Quality: 100
            #---- 1585 (4) ----
            #  mean read depth: 174.7x
            #  8,297 bp have a depth of zero (99.6604% coverage)
            #  271 positions changed (0.0111% of total positions)
            #  estimated pre-polishing sequence accuracy: 99.9889% (Q39.55)
            #Step 1: read QC
            fastp --in1 ../../s-epidermidis-1585_R1.fastq.gz --in2 ../../s-epidermidis-1585_R2.fastq.gz --out1 1.fastq.gz --out2 2.fastq.gz --unpaired1 u.fastq.gz --unpaired2 u.fastq.gz
            #Step 2: Polypolish
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            bwa index ${cluster}/7_final_consensus.fasta
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 1.fastq.gz > ${cluster}/alignments_1.sam
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 2.fastq.gz > ${cluster}/alignments_2.sam
            polypolish polish ${cluster}/7_final_consensus.fasta ${cluster}/alignments_1.sam ${cluster}/alignments_2.sam > ${cluster}/polypolish.fasta
            done
            #Step 3: POLCA
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            cd ${cluster}
            polca.sh -a polypolish.fasta -r "../../../s-epidermidis-1585_R1.fastq.gz ../../../s-epidermidis-1585_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 7
            #Insertion/Deletion Errors: 4
            #Assembly Size: 2443174
            #Consensus Quality: 99.9995
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 9014
            #Consensus Quality: 100
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 9014
            #Consensus Quality: 100
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2344
            #Consensus Quality: 100
            #Step 4: (optional) more rounds and/or other polishers
            #After one round of Polypolish and one round of POLCA, your assembly should be in very good shape!
            #However, there may still be a few lingering errors. You can try running additional rounds of Polypolish or POLCA to see if they make any more changes.
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa -r "../../../s-epidermidis-1585_R1.fastq.gz ../../../s-epidermidis-1585_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2443176
            #Consensus Quality: 100
            #---- 1585 derived from unicycler, under 1585_normal/unicycler (4) ----
            #Step 0: copy chrom and plasmid1, plasmid2, plasmid3 to cluster_001/7_final_consensus.fasta, ...
            #Step 1: read QC
            fastp --in1 ../../s-epidermidis-1585_R1.fastq.gz --in2 ../../s-epidermidis-1585_R2.fastq.gz --out1 1.fastq.gz --out2 2.fastq.gz --unpaired1 u.fastq.gz --unpaired2 u.fastq.gz
            #Step 2: Polypolish
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            bwa index ${cluster}/7_final_consensus.fasta
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 1.fastq.gz > ${cluster}/alignments_1.sam
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 2.fastq.gz > ${cluster}/alignments_2.sam
            polypolish polish ${cluster}/7_final_consensus.fasta ${cluster}/alignments_1.sam ${cluster}/alignments_2.sam > ${cluster}/polypolish.fasta
            done
            #Polishing 1 (2,443,574 bp):
            #mean read depth: 174.7x
            #8,298 bp have a depth of zero (99.6604% coverage)
            #52 positions changed (0.0021% of total positions)
            #estimated pre-polishing sequence accuracy: 99.9979% (Q46.72)
            #Polishing 2 (9,014 bp):
            #mean read depth: 766.5x
            #3 bp have a depth of zero (99.9667% coverage)
            #0 positions changed (0.0000% of total positions)
            #estimated pre-polishing sequence accuracy: 100.0000% (Q∞)
            #Polishing 7 (2,344 bp):
            #mean read depth: 2893.0x
            #4 bp have a depth of zero (99.8294% coverage)
            #0 positions changed (0.0000% of total positions)
            #estimated pre-polishing sequence accuracy: 100.0000% (Q∞)
            #Polishing 8 (2,255 bp):
            #mean read depth: 2719.6x
            #4 bp have a depth of zero (99.8226% coverage)
            #0 positions changed (0.0000% of total positions)
            #estimated pre-polishing sequence accuracy: 100.0000% (Q∞)
            #Step 3: POLCA
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            cd ${cluster}
            polca.sh -a polypolish.fasta -r "../../../s-epidermidis-1585_R1.fastq.gz ../../../s-epidermidis-1585_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 7
            #Insertion/Deletion Errors: 4
            #Assembly Size: 2443598
            #Consensus Quality: 99.9995
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 9014
            #Consensus Quality: 100
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2344
            #Consensus Quality: 100
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2255
            #Consensus Quality: 100
            #Step 4: (optional) more rounds and/or other polishers
            #After one round of Polypolish and one round of POLCA, your assembly should be in very good shape!
            #However, there may still be a few lingering errors. You can try running additional rounds of Polypolish or POLCA to see if they make any more changes.
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa -r "../../../s-epidermidis-1585_R1.fastq.gz ../../../s-epidermidis-1585_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2443600
            #Consensus Quality: 100
            #-- 1585v (1, no short reads, waiting) --
            # TODO!
            #-- 5179 (2) --
            #mean read depth: 120.7x
            #7,547 bp have a depth of zero (99.6946% coverage)
            #356 positions changed (0.0144% of total positions)
            #estimated pre-polishing sequence accuracy: 99.9856% (Q38.41)
            #Step 1: read QC
            fastp --in1 ../../s-epidermidis-5179_R1.fastq.gz --in2 ../../s-epidermidis-5179_R2.fastq.gz --out1 1.fastq.gz --out2 2.fastq.gz --unpaired1 u.fastq.gz --unpaired2 u.fastq.gz
            #Step 2: Polypolish
            for cluster in cluster_001 cluster_002; do
            bwa index ${cluster}/7_final_consensus.fasta
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 1.fastq.gz > ${cluster}/alignments_1.sam
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 2.fastq.gz > ${cluster}/alignments_2.sam
            polypolish polish ${cluster}/7_final_consensus.fasta ${cluster}/alignments_1.sam ${cluster}/alignments_2.sam > ${cluster}/polypolish.fasta
            done
            #Step 3: POLCA
            for cluster in cluster_001 cluster_002; do
            cd ${cluster}
            polca.sh -a polypolish.fasta -r "../../../s-epidermidis-5179_R1.fastq.gz ../../../s-epidermidis-5179_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 49
            #Insertion/Deletion Errors: 23
            #Assembly Size: 2471418
            #Consensus Quality: 99.9971
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 17748
            #Consensus Quality: 100
            #Step 4: (optional) more rounds POLCA
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa -r "../../../s-epidermidis-5179_R1.fastq.gz ../../../s-epidermidis-5179_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 10
            #Insertion/Deletion Errors: 5
            #Assembly Size: 2471442
            #Consensus Quality: 99.9994
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa.PolcaCorrected.fa -r "../../../s-epidermidis-5179_R1.fastq.gz ../../../s-epidermidis-5179_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            Substitution Errors: 6
            Insertion/Deletion Errors: 0
            Assembly Size: 2471445
            Consensus Quality: 99.9998
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa.PolcaCorrected.fa.PolcaCorrected.fa -r "../../../s-epidermidis-5179_R1.fastq.gz ../../../s-epidermidis-5179_R2.fastq.gz" -t 55 -m 120G
            cd ..
            done
            Substitution Errors: 0
            Insertion/Deletion Errors: 0
            Assembly Size: 2471445
            Consensus Quality: 100
            #-- HD5_2 (2): without the short-sequencing we cannot correct the base-calling! --
            # !ERROR to be REPORTED, the
            #Polishing cluster_001_consensus (2,504,140 bp):
            #mean read depth: 94.4x
            #240,420 bp have a depth of zero (90.3991% coverage)
            #56,894 positions changed (2.2720% of total positions)
            #estimated pre-polishing sequence accuracy: 97.7280% (Q16.44)
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_1_S37_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_1_S37_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_2_S38_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_2_S38_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_3_S39_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_3_S39_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_4_S40_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_4_S40_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_5_S41_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_5_S41_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_6_S42_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_6_S42_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_7_S43_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_7_S43_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_8_S44_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_8_S44_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_9_S45_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_9_S45_R2_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_10_S46_R1_001.fastq
            /media/jhuang/Elements2/Data_Anna12_HAPDICS_HyAsP/180821_rohde/HD5_10_S46_R2_001.fastq
            #Step 1: read QC
            fastp --in1 ../../HD5_2_S38_R1_001.fastq.gz --in2 ../../HD5_2_S38_R2_001.fastq.gz --out1 1.fastq.gz --out2 2.fastq.gz --unpaired1 u.fastq.gz --unpaired2 u.fastq.gz
            # NOTE that the following steps are not run since the short-reads are not correct!
            # #Step 2: Polypolish
            # for cluster in cluster_001 cluster_005; do
            #   bwa index ${cluster}/7_final_consensus.fasta
            #   bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 1.fastq.gz > ${cluster}/alignments_1.sam
            #   bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 2.fastq.gz > ${cluster}/alignments_2.sam
            #   polypolish polish ${cluster}/7_final_consensus.fasta ${cluster}/alignments_1.sam ${cluster}/alignments_2.sam > ${cluster}/polypolish.fasta
            # done
            # #Step 3: POLCA
            # for cluster in cluster_001 cluster_005; do
            #   cd ${cluster}
            #   polca.sh -a polypolish.fasta -r "../../../HD5_2_S38_R1_001.fastq.gz ../../../HD5_2_S38_R2_001.fastq.gz" -t 55 -m 120G
            #   cd ..
            # done
            # #Step 4: (optional) more rounds POLCA
            # for cluster in cluster_001; do
            #   cd ${cluster}
            #   polca.sh -a polypolish.fasta.PolcaCorrected.fa -r "../../../HD5_2_S38_R1_001.fastq.gz ../../../HD5_2_S38_R2_001.fastq.gz" -t 55 -m 120G
            #   cd ..
            # done
            # NOTE that the plasmids of HD5_2_K5 and HD5_2_K6 were copied from Unicycler!
            #-- HD5_2_K5 (4) --
            mean read depth: 87.1x
            25 bp have a depth of zero (99.9990% coverage)
            1,085 positions changed (0.0433% of total positions)
            estimated pre-polishing sequence accuracy: 99.9567% (Q33.63)
            #Step 1: read QC
            fastp --in1 ../../275_K5_Holger_S92_R1_001.fastq.gz --in2 ../../275_K5_Holger_S92_R2_001.fastq.gz --out1 1.fastq.gz --out2 2.fastq.gz --unpaired1 u.fastq.gz --unpaired2 u.fastq.gz
            #Step 2: Polypolish
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            bwa index ${cluster}/7_final_consensus.fasta
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 1.fastq.gz > ${cluster}/alignments_1.sam
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 2.fastq.gz > ${cluster}/alignments_2.sam
            polypolish polish ${cluster}/7_final_consensus.fasta ${cluster}/alignments_1.sam ${cluster}/alignments_2.sam > ${cluster}/polypolish.fasta
            done
            #Step 3: POLCA
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            cd ${cluster}
            polca.sh -a polypolish.fasta -r "../../../275_K5_Holger_S92_R1_001.fastq.gz ../../../275_K5_Holger_S92_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 146
            #Insertion/Deletion Errors: 2
            #Assembly Size: 2504401
            #Consensus Quality: 99.9941
            #Substitution Errors: 41
            #Insertion/Deletion Errors: 0
            #Assembly Size: 41288
            #Consensus Quality: 99.9007
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 9191
            #Consensus Quality: 100
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2767
            #Consensus Quality: 100
            #Step 4: (optional) more rounds POLCA
            for cluster in cluster_001 cluster_002; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa -r "../../../275_K5_Holger_S92_R1_001.fastq.gz ../../../275_K5_Holger_S92_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 41
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2504401
            #Consensus Quality: 99.9984
            #Substitution Errors: 8
            #Insertion/Deletion Errors: 0
            #Assembly Size: 41288
            #Consensus Quality: 99.9806
            for cluster in cluster_001 cluster_002; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa.PolcaCorrected.fa -r "../../../275_K5_Holger_S92_R1_001.fastq.gz ../../../275_K5_Holger_S92_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 8
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2504401
            #Consensus Quality: 99.9997
            #Substitution Errors: 4
            #Insertion/Deletion Errors: 0
            #Assembly Size: 41288
            #Consensus Quality: 99.9903
            for cluster in cluster_001 cluster_002; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa.PolcaCorrected.fa.PolcaCorrected.fa -r "../../../275_K5_Holger_S92_R1_001.fastq.gz ../../../275_K5_Holger_S92_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 8
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2504401
            #Consensus Quality: 99.9997
            #Substitution Errors: 4
            #Insertion/Deletion Errors: 0
            #Assembly Size: 41288
            #Consensus Quality: 99.9903
            #-- HD5_2_K6 (4) --
            #mean read depth: 116.7x
            #4 bp have a depth of zero (99.9998% coverage)
            #1,022 positions changed (0.0408% of total positions)
            #estimated pre-polishing sequence accuracy: 99.9592% (Q33.89)
            #Step 1: read QC
            fastp --in1 ../../276_K6_Holger_S95_R1_001.fastq.gz --in2 ../../276_K6_Holger_S95_R2_001.fastq.gz --out1 1.fastq.gz --out2 2.fastq.gz --unpaired1 u.fastq.gz --unpaired2 u.fastq.gz
            #Step 2: Polypolish
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            bwa index ${cluster}/7_final_consensus.fasta
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 1.fastq.gz > ${cluster}/alignments_1.sam
            bwa mem -t 55 -a ${cluster}/7_final_consensus.fasta 2.fastq.gz > ${cluster}/alignments_2.sam
            polypolish polish ${cluster}/7_final_consensus.fasta ${cluster}/alignments_1.sam ${cluster}/alignments_2.sam > ${cluster}/polypolish.fasta
            done
            #Step 3: POLCA
            for cluster in cluster_001 cluster_002 cluster_003 cluster_004; do
            cd ${cluster}
            polca.sh -a polypolish.fasta -r "../../../276_K6_Holger_S95_R1_001.fastq.gz ../../../276_K6_Holger_S95_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 164
            #Insertion/Deletion Errors: 2
            #Assembly Size: 2504398
            #Consensus Quality: 99.9934
            #Substitution Errors: 22
            #Insertion/Deletion Errors: 0
            #Assembly Size: 41288
            #Consensus Quality: 99.9467
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 9191
            #Consensus Quality: 100
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2767
            #Consensus Quality: 100
            #Step 4: (optional) more rounds POLCA
            for cluster in cluster_001 cluster_002; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa -r "../../../276_K6_Holger_S95_R1_001.fastq.gz ../../../276_K6_Holger_S95_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 32
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2504400
            #Consensus Quality: 99.9987
            #Substitution Errors: 0
            #Insertion/Deletion Errors: 0
            #Assembly Size: 41288
            #Consensus Quality: 100
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa.PolcaCorrected.fa -r "../../../276_K6_Holger_S95_R1_001.fastq.gz ../../../276_K6_Holger_S95_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 4
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2504400
            #Consensus Quality: 99.9998
            for cluster in cluster_001; do
            cd ${cluster}
            polca.sh -a polypolish.fasta.PolcaCorrected.fa.PolcaCorrected.fa.PolcaCorrected.fa -r "../../../276_K6_Holger_S95_R1_001.fastq.gz ../../../276_K6_Holger_S95_R2_001.fastq.gz" -t 55 -m 120G
            cd ..
            done
            #Substitution Errors: 2
            #Insertion/Deletion Errors: 0
            #Assembly Size: 2504400
            #Consensus Quality: 99.9999
  21. (Optional) use platon to confirm the plasmid contigs: https://github.com/oschwengers/platon

台锯使用安全指南

🔹 使用前

  • 检查锯片是否完好、紧固。
  • 确认护罩、分离刀、防反弹爪安装正确。
  • 戴好护目镜、耳罩,避免宽松衣物。

🔹 操作中

  • 双脚稳站,身体偏向一侧,不要正对锯片。
  • 使用 靠山(Fence) 保持直线切割。
  • 窄料必须用 推杆/推块(miter gauge),不要手靠近锯片。
  • 保持推料匀速,不要强行推进或扭动工件。

⚠️ 重点危险:反弹(Kickback)

  • 定义:工件夹住锯片后,被高速抛向操作者。
  • 常见原因
    • 缺少分离刀或安装不当。
    • 工件没有紧贴靠山,自由手推料。
    • 木料弯曲、节疤、潮湿变形。
    • 锯片钝或不合适。
  • 预防措施
    • 保持分离刀、防反弹爪正常工作。
    • 工件必须紧贴靠山,直线推送。
    • 检查木料质量,保持锯片锋利。
    • 操作者站位偏侧,避免正对锯片。

🔹 使用后

  • 关闭电源,等待锯片完全停止。
  • 使用刷子或吸尘器清理锯屑,切勿用手。

牢记:分离刀 + 正确推料 + 正确站位 = 避免反弹

Overlapping binding positions for Data_Vero_Kymographs

p853_250706_p502_averaged_output_events
p968_250702_p502_averaged_output_events
p853_250706_p511_averaged_output_events

(plot-numpy1) jhuang@WS-2290C:~/DATA/Data_Vero_Kymographs/Binding_positions$ python overlap_v16_calculate_average_matix.py

  1. Averaging: Compute the averaged values for each (position, time_bin) point.

(plot-numpy1) jhuang@WS-2290C:~/DATA/Data_Vero_Kymographs/Binding_positions$ python overlap_v17_draw_plot.py

  1. Threshold-based detection: Apply a signal threshold (e.g., 0.16) to identify bound states at each position and time bin.

  2. Merging neighboring events: Combine adjacent bound regions in both position and time.

  3. Event filtering: Only merged events that satisfy the following conditions are reported as binding events and annotated in the plot:

    • min_duration = 1 # minimum number of time bins
    • min_range = 0.08 μm # minimum position spread for an event
  4. Event statistics: Calculate time bin ranges, durations, peak sizes, and average positions for each event.

Source code of overlap_v16_calculate_average_matix.py

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import glob
import os
from scipy.ndimage import label

# List of input CSV files
file_list = glob.glob("tracks_p853_250706_p511/*.csv")
print(f"Found {len(file_list)} CSV files: {file_list}")

# Ensure output directory exists
output_dir = os.path.dirname(file_list[0]) if file_list else "."
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# Collect all data
all_data = []
all_positions = []
for file in file_list:
    try:
        df = pd.read_csv(file, sep=';').rename(columns=lambda x: x.replace('# ', ''))
        positions = df['position (μm)'].values
        time_bins = df.columns[1:].values
        time_bin_data = df[df.columns[1:]].values
        all_positions.append(positions)
        all_data.append(time_bin_data)
    except Exception as e:
        print(f"Error processing {file} for data collection: {e}")
        continue

# Determine common position range and interpolate
min_pos = np.min([pos.min() for pos in all_positions if len(pos) > 0])
max_pos = np.max([pos.max() for pos in all_positions if len(pos) > 0])
max_len = max(len(pos) for pos in all_positions if len(pos) > 0)
common_positions = np.linspace(min_pos, max_pos, max_len)

# Interpolate each file's data
interpolated_data = []
for positions, time_bin_data in zip(all_positions, all_data):
    if len(positions) != time_bin_data.shape[0]:
        print("Warning: Mismatch in dimensions, skipping interpolation.")
        continue
    interpolated = np.zeros((time_bin_data.shape[1], len(common_positions)))
    for i in range(time_bin_data.shape[1]):
        interpolated[i] = np.interp(common_positions, positions, time_bin_data[:, i])
    interpolated_data.append(interpolated)

# Compute averaged data
if interpolated_data:
    averaged_data = np.mean(interpolated_data, axis=0)
else:
    print("No data available for averaging.")
    exit()

# Save averaged CSV
output_df = pd.DataFrame(averaged_data.T, columns=[f"time bin {i}" for i in range(averaged_data.shape[0])])
output_df.insert(0, 'position (μm)', common_positions)
output_csv_path = os.path.join(output_dir, 'averaged_output.csv')
output_df.to_csv(output_csv_path, sep=';', index=False)
print(f"Saved averaged output to {output_csv_path}")

# Plot combined kymograph
plt.figure(figsize=(10, 6))
max_ptp = np.max([np.ptp(line) for line in averaged_data]) if averaged_data.size > 0 else 1
padding = 0.1 * np.max(averaged_data) if np.max(averaged_data) > 0 else 1
offset_step = max_ptp + padding
num_bins = averaged_data.shape[0]

for i in range(num_bins):
    line = averaged_data[i]
    offset = i * offset_step
    plt.plot(common_positions, line + offset, 'b-', linewidth=0.5)

y_ticks = [i * offset_step for i in range(num_bins)]
y_labels = [f"time bin {i}" for i in range(num_bins)]
plt.yticks(y_ticks, y_labels)
plt.xlabel('Position (μm)')
plt.ylabel('Binding Density')
plt.title('Combined Kymograph Across All Files')
combined_output_path = os.path.join(output_dir, 'combined_binding_density.png')
plt.savefig(combined_output_path, facecolor='white', edgecolor='none')
plt.close()
print(f"Saved combined kymograph plot to {combined_output_path}")

# ======================================================
# Binding Event Detection + Plotting
# ======================================================

#signal_threshold = 0.2   # min photon density
#min_duration = 1         # min time bins
#min_range = 0.1         # μm, min position spread for an event
signal_threshold = 0.16   # min photon density
min_duration = 1         # min time bins
min_range = 0.08         # μm, min position spread for an event

for file in file_list:
    try:
        df = pd.read_csv(file, sep=';').rename(columns=lambda x: x.replace('# ', ''))
        positions = df['position (μm)'].values
        time_bins = df.columns[1:]
        photons_matrix = df[time_bins].values

        # Step 1: Binary mask
        mask = photons_matrix > signal_threshold

        # Step 2: Connected components
        labeled, num_features = label(mask, structure=np.ones((3, 3)))

        events = []
        for i in range(1, num_features + 1):
            coords = np.argwhere(labeled == i)
            pos_idx = coords[:, 0]
            time_idx = coords[:, 1]

            start_bin = time_idx.min()
            end_bin = time_idx.max()
            duration = end_bin - start_bin + 1

            pos_range = positions[pos_idx].max() - positions[pos_idx].min()

            # Apply filters
            if duration < min_duration or pos_range < min_range:
                continue

            avg_pos = positions[pos_idx].mean()
            peak_size = photons_matrix[pos_idx, time_idx].max()

            events.append({
                "start_bin": int(start_bin),
                "end_bin": int(end_bin),
                "duration_bins": int(duration),
                "pos_range": float(pos_range),
                "avg_position": float(avg_pos),
                "peak_size": float(peak_size)
            })

        # Print results
        print(f"\nBinding events for {os.path.basename(file)}:")
        if not events:
            print("No binding events detected.")
        else:
            for ev in events:
                print(
                    f" - Time bins {ev['start_bin']}–{ev['end_bin']} "
                    f"(duration {ev['duration_bins']}), "
                    f"Pos range: {ev['pos_range']:.2f} μm, "
                    f"Peak: {ev['peak_size']:.2f}, "
                    f"Avg pos: {ev['avg_position']:.2f} μm"
                )

        # Plot heatmap with detected events
        plt.figure(figsize=(10, 6))
        plt.imshow(
            photons_matrix.T,
            aspect='auto',
            origin='lower',
            extent=[positions.min(), positions.max(), 0, len(time_bins)],
            cmap='viridis'
        )
        plt.colorbar(label="Photon counts")
        plt.xlabel("Position (μm)")
        plt.ylabel("Time bin")
        plt.title(f"Kymograph with Binding Events: {os.path.basename(file)}")

        # Overlay events
        for ev in events:
            mid_bin = (ev["start_bin"] + ev["end_bin"]) / 2
            plt.scatter(ev["avg_position"], mid_bin, color="red", marker="o", s=40)
            plt.text(
                ev["avg_position"], mid_bin + 0.5,
                f"{ev['duration_bins']} bins, {ev['pos_range']:.2f} μm",
                color="white", fontsize=7, ha="center"
            )

        out_path = os.path.join(output_dir, os.path.basename(file).replace(".csv", "_events.png"))
        plt.savefig(out_path, dpi=150, bbox_inches="tight")
        plt.close()
        print(f"Saved event plot to {out_path}")

    except Exception as e:
        print(f"Error processing {file}: {e}")
        continue

Source code of overlap_v17_draw_plot.py

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import glob
import os
from scipy.ndimage import label

# List of input CSV files
file_list = glob.glob("tracks_p853_250706_p511/*.csv")
print(f"Found {len(file_list)} CSV files: {file_list}")

# Ensure output directory exists
output_dir = os.path.dirname(file_list[0]) if file_list else "."
debug_dir = os.path.join(output_dir, "debug_outputs")
os.makedirs(debug_dir, exist_ok=True)

# Parameters
signal_threshold = 0.16   # min photon density
min_duration = 1         # min time bins
min_range = 0.08         # μm, min position spread for an event

# Process each file
for file in file_list:
    try:
        # Read data
        df = pd.read_csv(file, sep=';').rename(columns=lambda x: x.replace('# ', ''))
        positions = df['position (μm)'].values
        time_bins = df.columns[1:]
        photons_matrix = df[time_bins].values

        # =========================
        # Step 1: Threshold mask
        # =========================
        mask = (photons_matrix > signal_threshold).astype(int)

        mask_df = pd.DataFrame(mask, columns=[f"time {i}" for i in range(mask.shape[1])])
        mask_df.insert(0, "position (μm)", positions)
        mask_path = os.path.join(debug_dir, os.path.basename(file).replace(".csv", "_mask.csv"))
        mask_df.to_csv(mask_path, sep=";", index=False)
        print(f"Saved mask matrix to {mask_path}")

        # =========================
        # Step 2: Connected components
        # =========================
        labeled, num_features = label(mask, structure=np.ones((3, 3)))

        labeled_df = pd.DataFrame(labeled, columns=[f"time {i}" for i in range(labeled.shape[1])])
        labeled_df.insert(0, "position (μm)", positions)
        labeled_path = os.path.join(debug_dir, os.path.basename(file).replace(".csv", "_labeled.csv"))
        labeled_df.to_csv(labeled_path, sep=";", index=False)
        print(f"Saved labeled matrix to {labeled_path}")

        # =========================
        # Step 3: Extract events
        # =========================
        events = []
        for i in range(1, num_features + 1):
            coords = np.argwhere(labeled == i)
            pos_idx = coords[:, 0]
            time_idx = coords[:, 1]

            start_bin = time_idx.min()
            end_bin = time_idx.max()
            duration = end_bin - start_bin + 1
            pos_range = positions[pos_idx].max() - positions[pos_idx].min()

            # Apply filters
            if duration < min_duration or pos_range < min_range:
                continue

            avg_pos = positions[pos_idx].mean()
            peak_size = photons_matrix[pos_idx, time_idx].max()

            events.append({
                "event_id": i,
                "start_bin": int(start_bin),
                "end_bin": int(end_bin),
                "duration_bins": int(duration),
                "pos_range": float(pos_range),
                "avg_position": float(avg_pos),
                "peak_size": float(peak_size)
            })

        # Save event table
        events_df = pd.DataFrame(events)
        event_table_path = os.path.join(debug_dir, os.path.basename(file).replace(".csv", "_events.csv"))
        events_df.to_csv(event_table_path, sep=";", index=False)
        print(f"Saved event table to {event_table_path}")

        # =========================
        # Step 4: Plot with debug overlays
        # =========================
        plt.figure(figsize=(10, 6))
        plt.imshow(
            photons_matrix.T,
            aspect='auto',
            origin='lower',
            extent=[positions.min(), positions.max(), 0, len(time_bins)],
            cmap='viridis'
        )
        plt.colorbar(label="Binding density (tracks)")    #Photon counts
        plt.xlabel("Position (μm)")
        plt.ylabel("Time bin")
        plt.title(f"Kymograph with Binding Events: {os.path.basename(file)}")

        for ev in events:
            mid_bin = (ev["start_bin"] + ev["end_bin"]) / 2
            plt.scatter(ev["avg_position"], mid_bin, color="red", marker="o", s=40)
            plt.text(
                ev["avg_position"], mid_bin + 0.5,
                f"ID {ev['event_id']}, {ev['duration_bins']} bins, {ev['pos_range']:.2f} μm",
                color="white", fontsize=7, ha="center"
            )

        out_path = os.path.join(debug_dir, os.path.basename(file).replace(".csv", "_events.png"))
        plt.savefig(out_path, dpi=150, bbox_inches="tight")
        plt.close()
        print(f"Saved debug plot to {out_path}")

    except Exception as e:
        print(f"Error processing {file}: {e}")
        continue

乌斯怀亚 (Ushuaia)

乌斯怀亚是阿根廷火地省(Tierra del Fuego)的首府,被誉为 “世界最南端的城市”
它不仅是地理意义上的极南之地,也是通往南极洲的重要门户。


📍 地理位置

  • 位于南美洲最南端,濒临 比格尔海峡 (Beagle Channel)
  • 北靠 马夏尔山脉 (Martial Mountains),南临大海,地形独特。
  • 纬度大约在 南纬 54°48′,几乎接近南极圈。

🌍 城市特色

  • 世界最南端的城市:比智利的蓬塔阿雷纳斯更靠南,因此享有“世界尽头 (Fin del Mundo)”的称号。
  • 气候属于 副极地海洋性气候
    • 夏季(12–2月)气温约 6–15°C
    • 冬季(6–8月)气温常在 -2–5°C
  • 一年四季多变,常常一天之内体验四季。

🏔️ 自然环境

  • 雪山:马夏尔山脉常年白雪皑皑,适合滑雪与登山。
  • 海洋:比格尔海峡水域中有丰富的海洋生物,包括企鹅、海狮、鲸鱼。
  • 森林与苔原:周边有大片冷温带森林,是徒步和露营的理想地。

🚢 旅游与探险

  • 南极游轮出发点:大多数前往南极洲的探险船与邮轮都从乌斯怀亚出发。
  • 户外活动:滑雪、徒步、皮划艇、观鸟、野生动物摄影。
  • 知名景点
    • 火地国家公园 (Parque Nacional Tierra del Fuego)
    • 世界尽头博物馆 (Museo del Fin del Mundo)
    • 世界尽头火车 (Tren del Fin del Mundo)

👥 人口与社会

  • 人口大约 75,000–80,000 人
  • 城市中既有当地的原住民后裔,也有来自欧洲与其他南美国家的移民。
  • 以旅游业、渔业、科研和军队驻地为主要经济支柱。

🕰️ 历史背景

  • 原住民:最早居住在此的是 雅干人 (Yaghan, 也称Yámana),他们是世界上最南端的原住民族之一。
  • 欧洲殖民:19世纪时,英国传教士与阿根廷殖民者进入该地。
  • 刑罚殖民地:乌斯怀亚曾在20世纪初被阿根廷政府用作流放犯人的监狱城,这一点与澳大利亚的塔斯马尼亚有些相似。
  • 之后逐渐发展为一个行政与军事中心,后来旅游业和科研活动成为主要推动力。

✨ 总结

乌斯怀亚不仅仅是 “世界尽头” 的代名词,
它是一个兼具 壮丽自然景观、探险精神与文化历史 的城市。
无论是作为前往南极的门户,还是南美南端的冒险目的地,乌斯怀亚都拥有独一无二的魅力。

Processing Data_Karoline_16S_2025

author: ""
date: '`r format(Sys.time(), "%d %m %Y")`'
header-includes:
     - \usepackage{color, fancyvrb}
output:
    rmdformats::readthedown:
        highlight: kate
        number_sections : yes
    pdf_document:
        toc: yes
        toc_depth: 2
        number_sections : yes
---

```{r, echo=FALSE, warning=FALSE}
## Global options
# TODO: reproduce the html with the additional figure/SVN-files for editing.
# IMPORTANT NOTE: needs before "mkdir figures"
#NEEDs to be often close R and start R, then new rendering --> working!
#rmarkdown::render('Phyloseq.Rmd',output_file='Phyloseq.html')
#install.packages("heatmaply")
#install.packages("gplots")
#BiocManager::install("phyloseq")
#library(phyloseq)
#DEBUG a package conflict: using phyloseq::tax_table() or detach(package:MicrobiotaProcess, unload=TRUE)
```

```{r load-packages, include=FALSE}

#install.packages(c("picante", "rmdformats"))
#mamba install -c conda-forge freetype libpng harfbuzz fribidi
#mamba install -c conda-forge r-systemfonts r-svglite r-kableExtra freetype fontconfig harfbuzz fribidi libpng
library(knitr)
library(rmdformats)
library(readxl)
library(dplyr)
library(kableExtra)
library(openxlsx)
library(DESeq2)
library(writexl)

options(max.print="75")
knitr::opts_chunk$set(fig.width=8,
                                            fig.height=6,
                                            eval=TRUE,
                                            cache=TRUE,
                                            echo=TRUE,
                                            prompt=FALSE,
                                            tidy=FALSE,
                                            comment=NA,
                                            message=FALSE,
                                            warning=FALSE)
opts_knit$set(width=85)
# Phyloseq R library
#* Phyloseq web site : https://joey711.github.io/phyloseq/index.html
#* See in particular tutorials for
#    - importing data: https://joey711.github.io/phyloseq/import-data.html
#    - heat maps: https://joey711.github.io/phyloseq/plot_heatmap-examples.html
```

# Data

Import raw data and assign sample key:

```{r, echo=FALSE, warning=FALSE}
#extend qiime2_metadata_for_qza_to_phyloseq.tsv with Diet and Flora
#setwd("~/DATA/Data_Laura_16S_2/core_diversity_e4753")
#map_corrected <- read.csv("qiime2_metadata_for_qza_to_phyloseq.tsv", sep="\t", row.names=1)
#knitr::kable(map_corrected) %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
```

# Prerequisites to be installed

* R : https://pbil.univ-lyon1.fr/CRAN/
* R studio : https://www.rstudio.com/products/rstudio/download/#download

```R
install.packages("dplyr")     # To manipulate dataframes
install.packages("readxl")    # To read Excel files into R
install.packages("ggplot2")   # for high quality graphics
install.packages("heatmaply")
source("https://bioconductor.org/biocLite.R")
biocLite("phyloseq")
```

```{r libraries, echo=TRUE, message=FALSE}
#mamba install -c conda-forge r-ggplot2 r-vegan r-data.table
#BiocManager::install("microbiome")
#install.packages("ggpubr")
#install.packages("heatmaply")
library("readxl") # necessary to import the data from Excel file
library("ggplot2") # graphics
library("picante")
library("microbiome") # data analysis and visualisation
library("phyloseq") # also the basis of data object. Data analysis and visualisation
library("ggpubr") # publication quality figures, based on ggplot2
library("dplyr") # data handling, filter and reformat data frames
library("RColorBrewer") # nice color options
library("heatmaply")
library(vegan)
library(gplots)
#install.packages("openxlsx")
library(openxlsx)
```

# Read the data and create phyloseq objects

Three tables are needed

* OTU
* Taxonomy
* Samples

```{r, echo=FALSE, warning=FALSE}

        library(tidyr)

        # For QIIME1
        #ps.ng.tax <- import_biom("./exported_table/feature-table.biom", "./exported-tree/tree.nwk")

        # For QIIME2
        #install.packages("remotes")
        #remotes::install_github("jbisanz/qiime2R")
        #"core_metrics_results/rarefied_table.qza", rarefying performed in the code, therefore import the raw table.
        library(qiime2R)
        ps.ng.tax <- qza_to_phyloseq(
            features =  "dada2_tests2/test_7_f240_r240/table.qza",
            tree = "rooted-tree.qza",
            metadata = "qiime2_metadata_for_qza_to_phyloseq.tsv"
        )
        # or
        #biom convert \
        #      -i ./exported_table/feature-table.biom \
        #      -o ./exported_table/feature-table-v1.biom \
        #      --to-json
        #ps.ng.tax <- import_biom("./exported_table/feature-table-v1.biom", treefilename="./exported-tree/tree.nwk")

        sample <- read.csv("./qiime2_metadata_for_qza_to_phyloseq.tsv", sep="\t", row.names=1)
        SAM = sample_data(sample, errorIfNULL = T)
        #rownames(SAM) <- c("1","2","3","5","6","7","8","9","10","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","46","47","48","49","50","51","52","53","55")

        #> setdiff(rownames(SAM), sample_names(ps.ng.tax))
        #[1] "sample-L9" should be removed since the low reads

        ps.ng.tax <- merge_phyloseq(ps.ng.tax, SAM)
        print(ps.ng.tax)

        taxonomy <- read.delim("exported-taxonomy/taxonomy.tsv", sep="\t", header=TRUE)
        #head(taxonomy)
        # Separate taxonomy string into separate ranks
        taxonomy_df <- taxonomy %>% separate(Taxon, into = c("Domain","Phylum","Class","Order","Family","Genus","Species"), sep = ";", fill = "right", extra = "drop")
        # Use Feature.ID as rownames
        rownames(taxonomy_df) <- taxonomy_df$Feature.ID
        taxonomy_df <- taxonomy_df[, -c(1, ncol(taxonomy_df))]  # Drop Feature.ID and Confidence
        # Create tax_table
        tax_table_final <- phyloseq::tax_table(as.matrix(taxonomy_df))
        # Merge tax_table with existing phyloseq object
        ps.ng.tax <- merge_phyloseq(ps.ng.tax, tax_table_final)
        # Check
        ps.ng.tax

        #colnames(phyloseq::tax_table(ps.ng.tax)) <- c("Domain","Phylum","Class","Order","Family","Genus","Species")
        saveRDS(ps.ng.tax, "./ps.ng.tax.rds")
```

Visualize data
```{r, echo=TRUE, warning=FALSE}
    sample_names(ps.ng.tax)
    rank_names(ps.ng.tax)
    sample_variables(ps.ng.tax)

    # Define sample names once
    samples <- c(
        "sample-A1","sample-A2","sample-A3","sample-A8","sample-A9","sample-A10",  #RESIZED: "sample-A4","sample-A5","sample-A6","sample-A7","sample-A11",
        "sample-B10","sample-B11","sample-B12","sample-B13","sample-B14","sample-B15","sample-B16",  #RESIZED: "sample-B1","sample-B2","sample-B3","sample-B4","sample-B5","sample-B6","sample-B7","sample-B8","sample-B9",
        "sample-C3","sample-C4","sample-C5","sample-C6","sample-C7",  #RESIZED: "sample-C1","sample-C2","sample-C8","sample-C9","sample-C10",
        "sample-E4","sample-E5","sample-E6","sample-E7","sample-E8",  #RESIZED: "sample-E1","sample-E2","sample-E3","sample-E9","sample-E10",
        "sample-F1","sample-F2","sample-F3","sample-F4","sample-F5",
        "sample-G1","sample-G2","sample-G3","sample-G4","sample-G5","sample-G6",
        "sample-H1","sample-H2","sample-H3","sample-H4","sample-H5","sample-H6",
        "sample-I1","sample-I2","sample-I3","sample-I4","sample-I5","sample-I6",
        "sample-J1","sample-J2","sample-J3","sample-J4","sample-J10","sample-J11",  #RESIZED: "sample-J5","sample-J6","sample-J7","sample-J8","sample-J9",
        "sample-K7","sample-K8","sample-K9","sample-K10",  #RESIZED: "sample-K1","sample-K2","sample-K3","sample-K4","sample-K5","sample-K6",  "sample-K11","sample-K12","sample-K13","sample-K14","sample-K15",
        "sample-L1","sample-L7","sample-L8","sample-L10",  #RESIZED: "sample-L2","sample-L3","sample-L4","sample-L5","sample-L6",  "sample-L11","sample-L12","sample-L13","sample-L14","sample-L15",
        "sample-M1","sample-M2","sample-M3","sample-M4","sample-M5","sample-M6","sample-M7","sample-M8",
        "sample-N1","sample-N2","sample-N3","sample-N4","sample-N5","sample-N6","sample-N7","sample-N8","sample-N9","sample-N10",
        "sample-O1","sample-O2","sample-O3","sample-O4","sample-O5","sample-O6","sample-O7","sample-O8"
    )
    ps.ng.tax <- prune_samples(samples, ps.ng.tax)

    sample_names(ps.ng.tax)
    rank_names(ps.ng.tax)
    sample_variables(ps.ng.tax)
```

Normalize number of reads in each sample using median sequencing depth.
```{r, echo=TRUE, warning=FALSE}
# RAREFACTION
set.seed(9242)  # This will help in reproducing the filtering and nomalisation.
ps.ng.tax <- rarefy_even_depth(ps.ng.tax, sample.size = 6389)
total <- 6389

# NORMALIZE number of reads in each sample using median sequencing depth.
total = median(sample_sums(ps.ng.tax))
#> total
#[1] 42369
standf = function(x, t=total) round(t * (x / sum(x)))
ps.ng.tax = transform_sample_counts(ps.ng.tax, standf)
ps.ng.tax_rel <- microbiome::transform(ps.ng.tax, "compositional")

saveRDS(ps.ng.tax, "./ps.ng.tax.rds")
hmp.meta <- meta(ps.ng.tax)
hmp.meta$sam_name <- rownames(hmp.meta)
```

# Prepare ps.ng.tax_rel, ps.ng.tax_abund, ps.ng.tax_abund_rel from ps.ng.tax

```{r, echo=FALSE, warning=FALSE}
#MOVE_FROM_ABOVE: The number of reads used for normalization is **`r sprintf("%.0f", total)`**.
#A basic heatmap using the default parameters.
#  plot_heatmap(ps.ng.tax, method = "NMDS", distance = "bray")
#NOTE that giving the correct OTU numbers in the text (1%, 0.5%, ...)!!!
```

For the heatmaps, we focus on the most abundant OTUs by first converting counts to relative abundances within each sample. We then filter to retain only OTUs whose mean relative abundance across all samples exceeds 0.1% (0.001). We are left with 199 OTUs which makes the reading much more easy.

```{r, echo=FALSE, warning=FALSE}

# Custom function to plot a heatmap with the specified sample order
#plot_heatmap_custom <- function(ps, sample_order, method = "NMDS", distance = "bray") {

# --Filtering strategy 1: This filters taxa based on raw counts (ps.ng.tax). For each taxon (across samples), it checks if it has a count that exceeds 1% of the total in at least one sample.     Description: We consider the most abundant OTUs for heatmaps. For example one can only take OTUs that represent at least 1% of reads in at least one sample. Remember we normalized all the sampples to median number of reads (total).  We are left with only 382 OTUS which makes the reading much more easy.
#ps.ng.tax_abund <- phyloseq::filter_taxa(ps.ng.tax, function(x) sum(x > total*0.01) > 0, TRUE)

# --Filtering strategy 2: This filters taxa based on relative abundances (ps.ng.tax_rel). It keeps only those taxa whose mean relative abundance across samples exceeds 0.1%.
# 1) Convert to relative abundances
ps.ng.tax_rel <- transform_sample_counts(ps.ng.tax, function(x) x / sum(x))

# 2) Get the logical vector of which OTUs to keep (based on relative abundance)
keep_vector <- phyloseq::filter_taxa(
    ps.ng.tax_rel,
    function(x) mean(x) > 0.001,
    prune = FALSE
)

# 3) Use the TRUE/FALSE vector to subset absolute abundance data
ps.ng.tax_abund <- prune_taxa(names(keep_vector)[keep_vector], ps.ng.tax)

# 4) Normalize the final subset to relative abundances per sample
ps.ng.tax_abund_rel <- transform_sample_counts(
    ps.ng.tax_abund,
    function(x) x / sum(x)
)
```

# Heatmaps

```{r, echo=FALSE, warning=FALSE}
datamat_ = as.data.frame(otu_table(ps.ng.tax_abund))

#datamat <- datamat_[c("1","2","5","6","7",  "8","9","10","12","13","14",    "15","16","17","18","19","20",  "21","22","23","24","25","26","27","28",    "29","30","31","32",  "33","34","35","36","37","38","39","51",    "40","41","42","43","44","46",  "47","48","49","50","52","53","55")]
datamat <- datamat_[c(
        "sample-A1","sample-A2","sample-A3","sample-A8","sample-A9","sample-A10",  #RESIZED: "sample-A4","sample-A5","sample-A6","sample-A7","sample-A11",
        "sample-B10","sample-B11","sample-B12","sample-B13","sample-B14","sample-B15","sample-B16",  #RESIZED: "sample-B1","sample-B2","sample-B3","sample-B4","sample-B5","sample-B6","sample-B7","sample-B8","sample-B9",
        "sample-C3","sample-C4","sample-C5","sample-C6","sample-C7",  #RESIZED: "sample-C1","sample-C2","sample-C8","sample-C9","sample-C10",
        "sample-E4","sample-E5","sample-E6","sample-E7","sample-E8",  #RESIZED: "sample-E1","sample-E2","sample-E3","sample-E9","sample-E10",
        "sample-F1","sample-F2","sample-F3","sample-F4","sample-F5",
        "sample-G1","sample-G2","sample-G3","sample-G4","sample-G5","sample-G6",
        "sample-H1","sample-H2","sample-H3","sample-H4","sample-H5","sample-H6",
        "sample-I1","sample-I2","sample-I3","sample-I4","sample-I5","sample-I6",
        "sample-J1","sample-J2","sample-J3","sample-J4","sample-J10","sample-J11",  #RESIZED: "sample-J5","sample-J6","sample-J7","sample-J8","sample-J9",
        "sample-K7","sample-K8","sample-K9","sample-K10",  #RESIZED: "sample-K1","sample-K2","sample-K3","sample-K4","sample-K5","sample-K6",  "sample-K11","sample-K12","sample-K13","sample-K14","sample-K15",
        "sample-L1","sample-L7","sample-L8","sample-L10",  #RESIZED: "sample-L2","sample-L3","sample-L4","sample-L5","sample-L6",  "sample-L11","sample-L12","sample-L13","sample-L14","sample-L15",
        "sample-M1","sample-M2","sample-M3","sample-M4","sample-M5","sample-M6","sample-M7","sample-M8",
        "sample-N1","sample-N2","sample-N3","sample-N4","sample-N5","sample-N6","sample-N7","sample-N8","sample-N9","sample-N10",
        "sample-O1","sample-O2","sample-O3","sample-O4","sample-O5","sample-O6","sample-O7","sample-O8"
    )]
# Remove rows with zero variance
datamat <- datamat[apply(datamat, 1, var) > 0, ]
# Remove cols with zero variance
#datamat <- datamat[, apply(datamat, 2, var) > 0]

hr <- hclust(as.dist(1-cor(t(datamat), method="pearson")), method="complete")
hc <- hclust(as.dist(1-cor(datamat, method="spearman")), method="complete")
mycl = cutree(hr, h=max(hr$height)/1.08)
mycol = c("YELLOW", "DARKBLUE", "DARKORANGE", "DARKMAGENTA", "DARKCYAN", "DARKRED",  "MAROON", "DARKGREEN", "LIGHTBLUE", "PINK", "MAGENTA", "LIGHTCYAN","LIGHTGREEN", "BLUE", "ORANGE", "CYAN", "RED", "GREEN");

mycol = mycol[as.vector(mycl)]
sampleCols <- rep('GREY',ncol(datamat))
#names(sampleCols) <- c("Group1", "Group1", "Group1", "Group1", "Group1",   "Group2", "Group2",   "Group3", "Group3", "Group3",  ...)

# Define 14 colors
my_colors <- c("#a6cee3", "#1f78b4", "#b2df8a", "#33a02c",
                                "#fb9a99", "#e31a1c", "#fdbf6f", "#ff7f00",
                                "#cab2d6", "#6a3d9a", "#ffff99", "#b15928",
                                "#8dd3c7", "#fb8072")
# Example column names
colnames(datamat) <- c(
        "sample-A1","sample-A2","sample-A3","sample-A8","sample-A9","sample-A10",  #RESIZED: "sample-A4","sample-A5","sample-A6","sample-A7","sample-A11",
        "sample-B10","sample-B11","sample-B12","sample-B13","sample-B14","sample-B15","sample-B16",  #RESIZED: "sample-B1","sample-B2","sample-B3","sample-B4","sample-B5","sample-B6","sample-B7","sample-B8","sample-B9",
        "sample-C3","sample-C4","sample-C5","sample-C6","sample-C7",  #RESIZED: "sample-C1","sample-C2","sample-C8","sample-C9","sample-C10",
        "sample-E4","sample-E5","sample-E6","sample-E7","sample-E8",  #RESIZED: "sample-E1","sample-E2","sample-E3","sample-E9","sample-E10",
        "sample-F1","sample-F2","sample-F3","sample-F4","sample-F5",
        "sample-G1","sample-G2","sample-G3","sample-G4","sample-G5","sample-G6",
        "sample-H1","sample-H2","sample-H3","sample-H4","sample-H5","sample-H6",
        "sample-I1","sample-I2","sample-I3","sample-I4","sample-I5","sample-I6",
        "sample-J1","sample-J2","sample-J3","sample-J4","sample-J10","sample-J11",  #RESIZED: "sample-J5","sample-J6","sample-J7","sample-J8","sample-J9",
        "sample-K7","sample-K8","sample-K9","sample-K10",  #RESIZED: "sample-K1","sample-K2","sample-K3","sample-K4","sample-K5","sample-K6",  "sample-K11","sample-K12","sample-K13","sample-K14","sample-K15",
        "sample-L1","sample-L7","sample-L8","sample-L10",  #RESIZED: "sample-L2","sample-L3","sample-L4","sample-L5","sample-L6",  "sample-L11","sample-L12","sample-L13","sample-L14","sample-L15",
        "sample-M1","sample-M2","sample-M3","sample-M4","sample-M5","sample-M6","sample-M7","sample-M8",
        "sample-N1","sample-N2","sample-N3","sample-N4","sample-N5","sample-N6","sample-N7","sample-N8","sample-N9","sample-N10",
        "sample-O1","sample-O2","sample-O3","sample-O4","sample-O5","sample-O6","sample-O7","sample-O8"
    )
# (replace with your actual column names)

# Remove "sample-" prefix for easier matching
sample_names <- sub("^sample-", "", colnames(datamat))

# Create a function to match sample IDs to groups
assign_group <- function(sample_id) {
    # First letter indicates group
    prefix <- substr(sample_id, 1, 1)
    switch(prefix,
                 "A" = 1,
                 "B" = 2,
                 "C" = 3,
                 "E" = 4,
                 "F" = 5,
                 "G" = 6,
                 "H" = 7,
                 "I" = 8,
                 "J" = 9,
                 "K" = 10,
                 "L" = 11,
                 "M" = 12,
                 "N" = 13,
                 "O" = 14,
                 NA)
}
# Assign group numbers to samples
group_numbers <- sapply(sample_names, assign_group)
# Assign colors based on group numbers
sampleCols <- my_colors[group_numbers]
# Check results
print(sampleCols)
#'#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#cab2d6', '#6a3d9a'

#bluered(75)
#color_pattern <- colorRampPalette(c("blue", "white", "red"))(100)
library(RColorBrewer)
custom_palette <- colorRampPalette(brewer.pal(9, "Blues"))
heatmap_colors <- custom_palette(100)
#colors <- heatmap_color_default(100)
png("figures/heatmap.png", width=1200, height=2400)
#par(mar=c(2, 2, 2, 2))  , lwid=1    lhei=c(0.7, 10)) # Adjust height of color keys   keysize=0.3,
heatmap.2(as.matrix(datamat),Rowv=as.dendrogram(hr),Colv = NA, dendrogram = 'row',
                        scale='row',trace='none',col=heatmap_colors, cexRow=1.2, cexCol=1.5,
                        RowSideColors = mycol, ColSideColors = sampleCols, srtCol=15, labRow=row.names(datamat), key=TRUE, margins=c(10, 15), lhei=c(0.7, 15), lwid=c(1,8))
dev.off()
```

```{r, echo=TRUE, warning=FALSE, fig.cap="Heatmap", out.width = '100%', fig.align= "center"}
knitr::include_graphics("./figures/heatmap.png")
```

\pagebreak

```{r, echo=FALSE, warning=FALSE}
    library(stringr)
#FITTING1:
#for id in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100  101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199; do
#for id in 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300; do
#for id in 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382; do
#  echo "phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Domain\"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Domain\"], \"__\")[[1]][2]"
#  echo "phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Phylum\"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Phylum\"], \"__\")[[1]][2]"
#  echo "phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Class\"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Class\"], \"__\")[[1]][2]"
#  echo "phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Order\"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Order\"], \"__\")[[1]][2]"
#  echo "phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Family\"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Family\"], \"__\")[[1]][2]"
#  echo "phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Genus\"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Genus\"], \"__\")[[1]][2]"
#  echo "phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Species\"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[${id},\"Species\"], \"__\")[[1]][2]"
#done

phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[1,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[2,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[3,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[4,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[5,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[6,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[7,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[8,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[9,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[10,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[11,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[12,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[13,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[14,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[15,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[16,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[17,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[18,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[19,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[20,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[21,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[22,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[23,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[24,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[25,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[26,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[27,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[28,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[29,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[30,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[31,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[32,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[33,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[34,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[35,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[36,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[37,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[38,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[39,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[40,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[41,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[42,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[43,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[44,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[45,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[46,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[47,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[48,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[49,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[50,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[51,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[52,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[53,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[54,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[55,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[56,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[57,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[58,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[59,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[60,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[61,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[62,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[63,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[64,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[65,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[66,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[67,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[68,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[69,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[70,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[71,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[72,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[73,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[74,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[75,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[76,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[77,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[78,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[79,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[80,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[81,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[82,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[83,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[84,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[85,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[86,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[87,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[88,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[89,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[90,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[91,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[92,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[93,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[94,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[95,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[96,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[97,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[98,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[99,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[100,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[101,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[102,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[103,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[104,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[105,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[106,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[107,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[108,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[109,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[110,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[111,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[112,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[113,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[114,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[115,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[116,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[117,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[118,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[119,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[120,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[121,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[122,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[123,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[124,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[125,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[126,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[127,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[128,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[129,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[130,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[131,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[132,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[133,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[134,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[135,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[136,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[137,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[138,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[139,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[140,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[141,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[142,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[143,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[144,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[145,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[146,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[147,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[148,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[149,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[150,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[151,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[152,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[153,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[154,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[155,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[156,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[157,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[158,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[159,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[160,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[161,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[162,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[163,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[164,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[165,"Species"], "__")[[1]][2]

phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[166,"Species"], "__")[[1]][2]

phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Species"], "__")[[1]][2]

phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[167,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[168,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[169,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[170,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[171,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[172,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[173,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[174,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[175,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[176,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[177,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[178,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[179,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[180,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[181,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[182,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[183,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[184,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[185,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[186,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[187,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[188,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[189,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[190,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[191,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[192,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[193,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[194,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[195,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[196,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[197,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[198,"Species"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Domain"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Domain"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Phylum"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Phylum"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Class"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Class"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Order"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Order"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Family"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Family"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Genus"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Genus"], "__")[[1]][2]
phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Species"] <- str_split(phyloseq::tax_table(ps.ng.tax_abund_rel)[199,"Species"], "__")[[1]][2]

```

# Taxonomic summary

## Bar plots in phylum level

```{r, fig.width=16, fig.height=8, echo=TRUE, warning=FALSE}
    #aes(color="Phylum", fill="Phylum") --> aes()
    #ggplot(data=data, aes(x=Sample, y=Abundance, fill=Phylum))
    my_colors <- c("darkblue", "darkgoldenrod1", "darkseagreen", "darkorchid", "darkolivegreen1", "lightskyblue", "darkgreen", "deeppink", "khaki2", "firebrick", "brown1", "darkorange1", "cyan1", "royalblue4", "darksalmon", "darkblue","royalblue4", "dodgerblue3", "steelblue1", "lightskyblue", "darkseagreen", "darkgoldenrod1", "darkseagreen", "darkorchid", "darkolivegreen1", "brown1", "darkorange1", "cyan1", "darkgrey")
    plot_bar(ps.ng.tax_abund_rel, fill="Phylum") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black")) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=2))                                  #6 instead of theme.size
```
```{r, echo=FALSE, warning=FALSE}
    #png("abc.png")
    #knitr::include_graphics("./Phyloseq_files/figure-html/unnamed-chunk-7-1.png")
    #dev.off()
```

\pagebreak
Regroup together pre vs post stroke samples and normalize number of reads in each group using median sequencing depth.

```{r, echo=TRUE, warning=FALSE}
    ps.ng.tax_abund_rel_pre_post_stroke <- merge_samples(ps.ng.tax_abund_rel, "pre_post_stroke")
    #PENDING: The effect weighted twice by sum(x), is the same to the effect weighted once directly from absolute abundance?!
    ps.ng.tax_abund_rel_pre_post_stroke_ = transform_sample_counts(ps.ng.tax_abund_rel_pre_post_stroke, function(x) x / sum(x))
    #plot_bar(ps.ng.tax_abund_relSampleType_, fill = "Phylum") + geom_bar(aes(color=Phylum, fill=Phylum), stat="identity", position="stack")
    plot_bar(ps.ng.tax_abund_rel_pre_post_stroke_, fill="Phylum") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"))
```

```{r, echo=FALSE, warning=FALSE}

    #FITTING6: regulate the bar height if it has replicates: 11+16+10+10+5+6+6+6+11+15+14+8+10+8=136

    ps.ng.tax_abund_rel_weighted <- data.table::copy(ps.ng.tax_abund_rel)

    # Group1
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A1")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A2")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A3")]/6
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A4")]/11
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A5")]/11
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A6")]/11
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A7")]/11
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A8")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A9")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A9")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A10")]/6
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-A11")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-A11")]/11

    # Group2
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B1")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B2")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B3")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B4")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B5")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B6")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B7")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B8")]/16
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B9")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B9")]/16
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B10")]/7
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B11")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B11")]/7
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B12")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B12")]/7
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B13")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B13")]/7
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B14")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B14")]/7
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B15")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B15")]/7
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-B16")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-B16")]/7

    # Group3 # Choosing C3-C7 due to cage-filter
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C1")]/10
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C2")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C3")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C4")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C5")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C6")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C7")]/5
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C8")]/10
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C9")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C9")]/10
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-C10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-C10")]/10

    # Group4 # Choosing E4-E8 due to cage-filter
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E1")]/10
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E2")]/10
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E3")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E4")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E5")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E6")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E7")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E8")]/5
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E9")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E9")]/10
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-E10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-E10")]/10

    # Group5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-F1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-F1")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-F2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-F2")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-F3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-F3")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-F4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-F4")]/5
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-F5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-F5")]/5

    # Group6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-G1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-G1")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-G2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-G2")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-G3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-G3")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-G4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-G4")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-G5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-G5")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-G6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-G6")]/6

    # Group7
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-H1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-H1")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-H2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-H2")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-H3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-H3")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-H4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-H4")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-H5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-H5")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-H6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-H6")]/6

    # Group8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-I1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-I1")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-I2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-I2")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-I3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-I3")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-I4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-I4")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-I5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-I5")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-I6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-I6")]/6

    # Group9 #RESIZED:
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J1")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J2")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J3")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J4")]/6
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J5")]/11
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J6")]/11
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J7")]/11
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J8")]/11
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J9")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J9")]/11
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J10")]/6
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-J11")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-J11")]/6

    # Group10 #RESIZED:
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K1")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K2")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K3")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K4")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K5")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K6")]/15
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K7")]/4
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K8")]/4
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K9")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K9")]/4
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K10")]/4
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K11")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K11")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K12")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K12")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K13")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K13")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K14")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K14")]/15
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-K15")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-K15")]/15

    # Group11 #RESIZED:
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L1")]/4
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L2")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L3")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L4")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L5")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L6")]/14
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L7")]/4
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L8")]/4
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L10")]/4
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L11")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L11")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L12")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L12")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L13")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L13")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L14")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L14")]/14
    #otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-L15")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-L15")]/14

    # Group12
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M1")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M2")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M3")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M4")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M5")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M6")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M7")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-M8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-M8")]/8

    # Group13
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N1")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N10")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N10")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N2")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N3")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N4")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N5")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N6")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N7")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N8")]/10
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-N9")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-N9")]/10

    # Group14
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O1")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O1")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O2")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O2")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O3")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O3")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O4")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O4")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O5")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O5")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O6")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O6")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O7")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O7")]/8
    otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O8")] <- otu_table(ps.ng.tax_abund_rel)[,c("sample-O8")]/8

    sum(otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O1")])
    #[1] 0.125
    sum(otu_table(ps.ng.tax_abund_rel)[,c("sample-O1")])
    #[1] 1
```

\pagebreak
Use color according to phylum. Do separate panels Stroke and Sex_age.

```{r, echo=FALSE, warning=FALSE}
    #plot_bar(ps.ng.tax_abund_relswab_, x="Phylum", fill = "Phylum", facet_grid = Patient~RoundDay) + geom_bar(aes(color=Phylum, fill=Phylum), stat="identity", position="stack") + theme(axis.text = element_text(size = theme.size, colour="black"))
    plot_bar(ps.ng.tax_abund_rel_weighted, x="Phylum", fill="Phylum", facet_grid = pre_post_stroke~Sex_age) + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"), axis.text.x=element_blank(), axis.ticks=element_blank()) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=2))
```

## Bar plots in class level

```{r, fig.width=16, fig.height=8, echo=TRUE, warning=FALSE}
    my_colors <- c("darkblue", "darkgoldenrod1", "darkseagreen", "darkorchid", "darkolivegreen1", "lightskyblue", "darkgreen", "deeppink", "khaki2", "firebrick", "brown1", "darkorange1", "cyan1", "royalblue4", "darksalmon", "darkblue","royalblue4", "dodgerblue3", "steelblue1", "lightskyblue", "darkseagreen", "darkgoldenrod1", "darkseagreen", "darkorchid", "darkolivegreen1", "brown1", "darkorange1", "cyan1", "darkgrey")
    plot_bar(ps.ng.tax_abund_rel, fill="Class") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black")) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=3))
```

Regroup together pre vs post stroke samples and normalize number of reads in each group using median sequencing depth.
```{r, echo=TRUE, warning=FALSE}
    plot_bar(ps.ng.tax_abund_rel_pre_post_stroke_, fill="Class") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"))
```
\pagebreak

Use color according to class. Do separate panels Stroke and Sex_age.
```{r, echo=TRUE, warning=FALSE}
    #NOTE: MANALLY RUNNING the CODE by COPYING the CODE under R-console for the 6 blocks, then show them with knitr::include_graphics
    sum(otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O1")])
    plot_bar(ps.ng.tax_abund_rel_weighted, x="Class", fill="Class", facet_grid = pre_post_stroke~Sex_age) + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"), axis.text.x=element_blank(), axis.ticks=element_blank()) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=3))
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                # 准备数据
                ps_summary <- ps_df %>%
                    # 1. 只保留这三个 condition
                    filter(pre_post_stroke %in% c("pre.antibiotics", "baseline", "pre.stroke")) %>%

                    # 2. 聚合
                    group_by(Sex_age, pre_post_stroke, Class) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%

                    # 3. 设置 factor 顺序和重命名
                    mutate(
                        # 替换 Sex_age 名称
                        Sex_age = recode(Sex_age,
                                                        "female.aged" = "Female (Aged)",
                                                        "male.aged"   = "Male (Aged)",
                                                        "male.young"  = "Male (Young)"),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),

                        # 替换 condition 名称
                        pre_post_stroke = recode(pre_post_stroke,
                                                                        "pre.antibiotics" = "Pre Antibiotics",
                                                                        "baseline"        = "Baseline",
                                                                        "pre.stroke"      = "Pre Stroke"),
                        pre_post_stroke = factor(pre_post_stroke,
                                                                        levels = c("Pre Antibiotics", "Baseline", "Pre Stroke")),

                        Class = factor(Class)
                    )

                # 确保颜色数匹配
                class_levels <- levels(ps_summary$Class)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Class)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +  # 更窄的柱子
                    facet_grid(pre_post_stroke ~ ., scales = "free_x", drop = TRUE) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        strip.text = element_text(size = 10, face = "bold"),
                        legend.position = "right",               # ✅ legend 放右边
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    guides(fill = guide_legend(ncol = 1)) +     # 竖排图例
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Taxonomic Class Composition by Group and Condition"
                    )

                # 保存为 PNG 文件
                ggsave(
                    filename = "./figures/Separate_Stroke_and_SexAge_on_Class.png",
                    plot = p,
                    width = 8,
                    height = 6,
                    dpi = 200
                )

                knitr::include_graphics("./figures/Separate_Stroke_and_SexAge_on_Class.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "pre.antibiotics") %>%
                    group_by(Sex_age, Class) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Class = factor(Class)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Class)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Class)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Class Composition - Pre Antibiotics"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_6-8_Pre_Antibiotics_Class_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_6-8_Pre_Antibiotics_Class_Composition.png")
```

```{r, echo=FALSE, warning=FALSE}

# TODO _ERROR_NEXT_WEEK!!!!: why Group5 in baseline plots is extra low!, The plot is absolute number, it is not relative Abundance!!!!!
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "baseline") %>%
                    group_by(Sex_age, Class) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Class = factor(Class)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Class)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Class)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Class Composition - Baseline FMT donor"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_3-5_Baseline_FMT_donor_Class_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_3-5_Baseline_FMT_donor_Class_Composition.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                # 数据处理,只保留 "Pre Stroke"
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "pre.stroke") %>%
                    group_by(Sex_age, Class) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Class = factor(Class)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Class)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Class)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Class Composition - Pre Stroke"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_9-11_Pre_Stroke_Class_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_9-11_Pre_Stroke_Class_Composition.png")
```

# Export Relative abundances of Phylum, Class, Order, and Family levels across all samples.

```{r, fig.width=16, fig.height=8, echo=TRUE, warning=FALSE}
library(phyloseq)
library(writexl)
library(dplyr)

# Function to check for NA or empty values in a taxonomic rank
check_taxa_names <- function(tax_table, rank) {
    tax_values <- tax_table[[rank]]
    na_count <- sum(is.na(tax_values) | tax_values == "")
    cat("Number of NA or empty values in", rank, ":", na_count, "\n")
    if (na_count > 0) {
        cat("Taxa with NA or empty", rank, ":\n")
        print(tax_values[is.na(tax_values) | tax_values == ""])
    }
}

# Function to create and save relative abundance table for a given taxonomic rank with normalization
save_taxa_abundance <- function(ps, rank, output_file) {
    # Check for NA or empty values in the taxonomy table
    tax_table_df <- as.data.frame(tax_table(ps))
    check_taxa_names(tax_table_df, rank)

    # Aggregate OTUs by taxonomic rank, removing taxa with NA at the specified rank
    ps_glom <- tax_glom(ps, taxrank = rank, NArm = TRUE)

    # Extract OTU table (relative abundances)
    otu_table <- as.data.frame(otu_table(ps_glom))

    # Normalize each column to sum to 1
    otu_table_normalized <- apply(otu_table, 2, function(x) x / sum(x))

    # Convert matrix to data frame
    otu_table_normalized <- as.data.frame(otu_table_normalized)

    # Verify column sums are approximately 1.0
    col_sums <- colSums(otu_table_normalized)
    if (any(abs(col_sums - 1) > 1e-6)) {
        warning("Column sums in ", rank, " table do not equal 1.0: ", paste(col_sums, collapse = ", "))
    } else {
        cat("Column sums for ", rank, " table are all approximately 1.0\n")
    }

    # Extract taxonomy table and get the specified rank for taxa names
    tax_table_glom <- as.data.frame(tax_table(ps_glom))
    taxa_names <- tax_table_glom[[rank]]

    # Replace NA or empty strings with "Unclassified"
    taxa_names <- ifelse(is.na(taxa_names) | taxa_names == "", paste0("Unclassified_", rank), taxa_names)

    # Ensure unique row names
    taxa_names <- make.unique(taxa_names)

    # Set row names to taxa names (for internal reference)
    rownames(otu_table_normalized) <- taxa_names

    # Add taxa names as a column
    otu_table_normalized[[rank]] <- taxa_names

    # Reorder to move rank column to the first position
    otu_table_normalized <- otu_table_normalized[, c(rank, setdiff(names(otu_table_normalized), rank))]

    # Rename sample columns by removing "sample-" prefix
    names(otu_table_normalized)[-1] <- sub("sample-", "", names(otu_table_normalized)[-1])

    # Write the data frame to Excel, including the rank column
    write_xlsx(otu_table_normalized, path = output_file)
    cat("Saved", output_file, "\n")
}

# Verify column sums of ps.ng.tax_abund_rel
col_sums <- colSums(otu_table(ps.ng.tax_abund_rel))
cat("Column sums of ps.ng.tax_abund_rel:\n")
summary(col_sums)

# Generate Excel files for Phylum, Class, Order, and Family levels with normalization and renamed sample names
save_taxa_abundance(ps.ng.tax_abund_rel, "Phylum", "relative_abundance_phylum_old.xlsx")
save_taxa_abundance(ps.ng.tax_abund_rel, "Class", "relative_abundance_class_old.xlsx")
save_taxa_abundance(ps.ng.tax_abund_rel, "Order", "relative_abundance_order_old.xlsx")
save_taxa_abundance(ps.ng.tax_abund_rel, "Family", "relative_abundance_family_old.xlsx")
```

```{r, fig.width=16, fig.height=8, echo=TRUE, warning=FALSE}
library(phyloseq)
library(writexl)
library(dplyr)

# Function to check for NA or empty values in a taxonomic rank
check_taxa_names <- function(tax_table, rank) {
    tax_values <- tax_table[[rank]]
    na_count <- sum(is.na(tax_values) | tax_values == "")
    cat("Number of NA or empty values in", rank, ":", na_count, "\n")
    if (na_count > 0) {
        cat("Taxa with NA or empty", rank, ":\n")
        print(tax_values[is.na(tax_values) | tax_values == ""])
    }
}

# Function to create and save relative abundance table for a given taxonomic rank with normalization
save_taxa_abundance <- function(ps, rank, output_file) {
    # Clean the taxonomy table by removing D_[level]__ prefixes
    tax_table_df <- as.data.frame(tax_table(ps))
    tax_table_df[[rank]] <- ifelse(is.na(tax_table_df[[rank]]) | tax_table_df[[rank]] == "",
                                                                 paste0("Unclassified_", rank),
                                                                 sub("^D_[0-9]+__(.+)", "\\1", tax_table_df[[rank]]))
    tax_table(ps) <- as.matrix(tax_table_df)  # Update taxonomy table with cleaned names

    # Check for NA or empty values in the taxonomy table
    check_taxa_names(tax_table_df, rank)

    # Aggregate OTUs by taxonomic rank, removing taxa with NA at the specified rank
    ps_glom <- tax_glom(ps, taxrank = rank, NArm = TRUE)

    # Extract OTU table (relative abundances)
    otu_table <- as.data.frame(otu_table(ps_glom))

    # Normalize each column to sum to 1
    otu_table_normalized <- apply(otu_table, 2, function(x) x / sum(x))

    # Convert matrix to data frame
    otu_table_normalized <- as.data.frame(otu_table_normalized)

    # Verify column sums are approximately 1.0
    col_sums <- colSums(otu_table_normalized)
    if (any(abs(col_sums - 1) > 1e-6)) {
        warning("Column sums in ", rank, " table do not equal 1.0: ", paste(col_sums, collapse = ", "))
    } else {
        cat("Column sums for ", rank, " table are all approximately 1.0\n")
    }

    # Extract taxonomy table and get the specified rank for taxa names
    tax_table_glom <- as.data.frame(tax_table(ps_glom))
    taxa_names <- tax_table_glom[[rank]]

    # Ensure unique row names
    taxa_names <- make.unique(taxa_names)

    # Set row names to taxa names (for internal reference)
    rownames(otu_table_normalized) <- taxa_names

    # Add taxa names as a column
    otu_table_normalized[[rank]] <- taxa_names

    # Reorder to move rank column to the first position
    otu_table_normalized <- otu_table_normalized[, c(rank, setdiff(names(otu_table_normalized), rank))]

    # Rename sample columns by removing "sample-" prefix
    names(otu_table_normalized)[-1] <- sub("sample-", "", names(otu_table_normalized)[-1])

    # Write the data frame to Excel, including the rank column
    write_xlsx(otu_table_normalized, path = output_file)
    cat("Saved", output_file, "\n")
}

# Verify column sums of ps.ng.tax_abund_rel
col_sums <- colSums(otu_table(ps.ng.tax_abund_rel))
cat("Column sums of ps.ng.tax_abund_rel:\n")
summary(col_sums)

# Generate Excel files for Phylum, Class, Order, and Family levels with normalization and renamed sample names
save_taxa_abundance(ps.ng.tax_abund_rel, "Phylum", "relative_abundance_phylum.xlsx")
save_taxa_abundance(ps.ng.tax_abund_rel, "Class", "relative_abundance_class.xlsx")
save_taxa_abundance(ps.ng.tax_abund_rel, "Order", "relative_abundance_order.xlsx")
save_taxa_abundance(ps.ng.tax_abund_rel, "Family", "relative_abundance_family.xlsx")

#Sum up the last two colums with the same row.names to a new column, export the file as csv, then delete the two rows before last, then merge them with csv2xls to a Excel-file, adapt the sheet-names.

#~/Tools/csv2xls-0.4/csv_to_xls.py relative_abundance_phylum.csv relative_abundance_order.csv relative_abundance_family.csv -d$'\t' -o relative_abundance_phylum_order_family.xls;
```

## Bar plots in order level

```{r, fig.width=16, fig.height=8, echo=TRUE, warning=FALSE}
    my_colors <- c("darkblue", "darkgoldenrod1", "darkseagreen", "darkorchid", "darkolivegreen1", "lightskyblue", "darkgreen", "deeppink", "khaki2", "firebrick", "brown1", "darkorange1", "cyan1", "royalblue4", "darksalmon", "darkblue","royalblue4", "dodgerblue3", "steelblue1", "lightskyblue", "darkseagreen", "darkgoldenrod1", "darkseagreen", "darkorchid", "darkolivegreen1", "brown1", "darkorange1", "cyan1", "darkgrey")
    plot_bar(ps.ng.tax_abund_rel, fill="Order") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black")) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=4))
```

Regroup together pre vs post stroke and normalize number of reads in each group using median sequencing depth.
```{r, echo=TRUE, warning=FALSE}
    plot_bar(ps.ng.tax_abund_rel_pre_post_stroke_, fill="Order") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"))
```
\pagebreak

Use color according to order. Do separate panels Stroke and Sex_age.
```{r, echo=FALSE, warning=FALSE}

    #FITTING7: regulate the bar height if it has replicates
    sum(otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O1")])
    plot_bar(ps.ng.tax_abund_rel_weighted, x="Order", fill="Order", facet_grid = pre_post_stroke~Sex_age) + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"), axis.text.x=element_blank(), axis.ticks=element_blank()) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=4))
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                # 准备数据
                ps_summary <- ps_df %>%
                    # 1. 只保留这三个 condition
                    filter(pre_post_stroke %in% c("pre.antibiotics", "baseline", "pre.stroke")) %>%

                    # 2. 聚合
                    group_by(Sex_age, pre_post_stroke, Order) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%

                    # 3. 设置 factor 顺序和重命名
                    mutate(
                        # 替换 Sex_age 名称
                        Sex_age = recode(Sex_age,
                                                        "female.aged" = "Female (Aged)",
                                                        "male.aged"   = "Male (Aged)",
                                                        "male.young"  = "Male (Young)"),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),

                        # 替换 condition 名称
                        pre_post_stroke = recode(pre_post_stroke,
                                                                        "pre.antibiotics" = "Pre Antibiotics",
                                                                        "baseline"        = "Baseline",
                                                                        "pre.stroke"      = "Pre Stroke"),
                        pre_post_stroke = factor(pre_post_stroke,
                                                                        levels = c("Pre Antibiotics", "Baseline", "Pre Stroke")),

                        Order = factor(Order)
                    )

                # 确保颜色数匹配
                class_levels <- levels(ps_summary$Order)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Order)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +  # 更窄的柱子
                    facet_grid(pre_post_stroke ~ ., scales = "free_x", drop = TRUE) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        strip.text = element_text(size = 10, face = "bold"),
                        legend.position = "right",               # ✅ legend 放右边
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    guides(fill = guide_legend(ncol = 1)) +     # 竖排图例
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Taxonomic Order Composition by Group and Condition"
                    )

                # 保存为 PNG 文件
                ggsave(
                    filename = "./figures/Separate_Stroke_and_SexAge_on_Order.png",
                    plot = p,
                    width = 8,
                    height = 6,
                    dpi = 200
                )

                knitr::include_graphics("./figures/Separate_Stroke_and_SexAge_on_Order.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "pre.antibiotics") %>%
                    group_by(Sex_age, Order) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Order = factor(Order)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Order)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Order)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Order Composition - Pre Antibiotics"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_6-8_Pre_Antibiotics_Order_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_6-8_Pre_Antibiotics_Order_Composition.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "baseline") %>%
                    group_by(Sex_age, Order) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Order = factor(Order)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Order)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Order)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Order Composition - Baseline FMT donor"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_3-5_Baseline_FMT_donor_Order_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_3-5_Baseline_FMT_donor_Order_Composition.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "pre.stroke") %>%
                    group_by(Sex_age, Order) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Order = factor(Order)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Order)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Order)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Order Composition - Pre Stroke"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_9-11_Pre_Stroke_Order_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_9-11_Pre_Stroke_Order_Composition.png")
```

## Bar plots in family level

```{r, fig.width=16, fig.height=8, echo=TRUE, warning=FALSE}
    my_colors <- c(
                    "#FF0000", "#000000", "#0000FF", "#C0C0C0", "#FFFFFF", "#FFFF00", "#00FFFF", "#FFA500", "#00FF00", "#808080", "#FF00FF", "#800080", "#FDD017", "#0000A0", "#3BB9FF", "#008000", "#800000", "#ADD8E6", "#F778A1", "#800517", "#736F6E", "#F52887", "#C11B17", "#5CB3FF", "#A52A2A", "#FF8040", "#2B60DE", "#736AFF", "#1589FF", "#98AFC7", "#8D38C9", "#307D7E", "#F6358A", "#151B54", "#6D7B8D", "#FDEEF4", "#FF0080", "#F88017", "#2554C7", "#FFF8C6", "#D4A017", "#306EFF", "#151B8D", "#9E7BFF", "#EAC117", "#E0FFFF", "#15317E", "#6C2DC7", "#FBB917", "#FCDFFF", "#15317E", "#254117", "#FAAFBE", "#357EC7"
                )
    plot_bar(ps.ng.tax_abund_rel, fill="Family") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black")) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=8))
```

Regroup together pre vs post stroke samples and normalize number of reads in each group using median sequencing depth.
```{r, echo=TRUE, warning=FALSE}
    plot_bar(ps.ng.tax_abund_rel_pre_post_stroke_, fill="Family") + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"))
```
\pagebreak

Use color according to family. Do separate panels Stroke and Sex_age.
```{r, echo=TRUE, warning=FALSE}
    sum(otu_table(ps.ng.tax_abund_rel_weighted)[,c("sample-O1")])
    plot_bar(ps.ng.tax_abund_rel_weighted, x="Family", fill="Family", facet_grid = pre_post_stroke~Sex_age) + geom_bar(aes(), stat="identity", position="stack") +
    scale_fill_manual(values = my_colors) + theme(axis.text = element_text(size = 7, colour="black"), axis.text.x=element_blank(), axis.ticks=element_blank()) + theme(legend.position="bottom") + guides(fill=guide_legend(nrow=8))
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                # 准备数据
                ps_summary <- ps_df %>%
                    # 1. 只保留这三个 condition
                    filter(pre_post_stroke %in% c("pre.antibiotics", "baseline", "pre.stroke")) %>%

                    # 2. 聚合
                    group_by(Sex_age, pre_post_stroke, Family) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%

                    # 3. 设置 factor 顺序和重命名
                    mutate(
                        # 替换 Sex_age 名称
                        Sex_age = recode(Sex_age,
                                                        "female.aged" = "Female (Aged)",
                                                        "male.aged"   = "Male (Aged)",
                                                        "male.young"  = "Male (Young)"),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),

                        # 替换 condition 名称
                        pre_post_stroke = recode(pre_post_stroke,
                                                                        "pre.antibiotics" = "Pre Antibiotics",
                                                                        "baseline"        = "Baseline",
                                                                        "pre.stroke"      = "Pre Stroke"),
                        pre_post_stroke = factor(pre_post_stroke,
                                                                        levels = c("Pre Antibiotics", "Baseline", "Pre Stroke")),

                        Family = factor(Family)
                    )

                # 确保颜色数匹配
                class_levels <- levels(ps_summary$Family)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Family)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +  # 更窄的柱子
                    facet_grid(pre_post_stroke ~ ., scales = "free_x", drop = TRUE) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        strip.text = element_text(size = 10, face = "bold"),
                        legend.position = "right",               # ✅ legend 放右边
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    guides(fill = guide_legend(ncol = 2)) +     # 竖排图例
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Taxonomic Family Composition by Group and Condition"
                    )

                # 保存为 PNG 文件
                ggsave(
                    filename = "./figures/Separate_Stroke_and_SexAge_on_Family.png",
                    plot = p,
                    width = 9,
                    height = 6,
                    dpi = 200
                )

                knitr::include_graphics("./figures/Separate_Stroke_and_SexAge_on_Family.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                # 数据处理,只保留 "BL FMT donor"
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "pre.antibiotics") %>%
                    group_by(Sex_age, Family) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Family = factor(Family)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Family)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Family)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Family Composition - Pre Antibiotics"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_6-8_Pre_Antibiotics_Family_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_6-8_Pre_Antibiotics_Family_Composition.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                # 数据处理,只保留 "BL FMT donor"
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "baseline") %>%
                    group_by(Sex_age, Family) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Family = factor(Family)
                    )

                # 映射颜色
                class_levels <- levels(ps_summary$Family)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Family)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Family Composition - Baseline FMT donor"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_3-5_Baseline_FMT_donor_Family_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_3-5_Baseline_FMT_donor_Family_Composition.png")
```

```{r, echo=FALSE, warning=FALSE}
                ps_df <- phyloseq::psmelt(ps.ng.tax_abund_rel_weighted)
                # 数据处理,只保留 "Pre Stroke"
                ps_summary <- ps_df %>%
                    filter(pre_post_stroke == "pre.stroke") %>%
                    group_by(Sex_age, Family) %>%
                    summarise(Abundance = sum(Abundance), .groups = "drop") %>%
                    mutate(
                        Sex_age = recode(Sex_age,
                            "female.aged" = "Female (Aged)",
                            "male.aged" = "Male (Aged)",
                            "male.young" = "Male (Young)"
                        ),
                        Sex_age = factor(Sex_age, levels = c("Male (Aged)", "Female (Aged)", "Male (Young)")),
                        Family = factor(Family)
                    )
                # Save summarized raw data
                write.csv(ps_summary, "Pre_Stroke_Family_Composition_data.csv", row.names = FALSE)
                write_xlsx(ps_summary, "Pre_Stroke_Family_Composition_data.xlsx")

                # 映射颜色
                class_levels <- levels(ps_summary$Family)
                color_map <- setNames(my_colors[seq_along(class_levels)], class_levels)

                # 绘图
                p <- ggplot(ps_summary, aes(x = Sex_age, y = Abundance, fill = Family)) +
                    geom_bar(stat = "identity", position = "stack", width = 0.55) +
                    scale_fill_manual(values = color_map, drop = FALSE) +
                    theme_minimal(base_size = 11) +
                    theme(
                        axis.text.x = element_text(angle = 45, hjust = 1, size = 9, colour = "black"),
                        axis.title = element_text(size = 11),
                        legend.position = "right",
                        legend.title = element_blank(),
                        panel.grid.major.x = element_blank(),
                        panel.grid.minor = element_blank()
                    ) +
                    labs(
                        x = "Sex and Age Group",
                        y = "Relative Abundance",
                        title = "Family Composition - Pre Stroke"
                    ) +
                    guides(fill = guide_legend(ncol = 2))

                # 保存图像
                ggsave(
                    filename = "./figures/Group_9-11_Pre_Stroke_Family_Composition.png",
                    plot = p,
                    width = 8,
                    height = 5,
                    dpi = 200
                )

                # 插入图像到报告
                knitr::include_graphics("./figures/Group_9-11_Pre_Stroke_Family_Composition.png")
```

\pagebreak

# Alpha diversity
Plot Chao1 richness estimator, Observed OTUs, Shannon index, and Phylogenetic diversity.
Regroup together samples from the same group.
```{r, echo=FALSE, warning=FALSE}
# using rarefied data
#FITTING2: CONSOLE:
#gunzip table_even4753.biom.gz
#alpha_diversity.py -i table_even42369.biom --metrics chao1,observed_otus,shannon,PD_whole_tree -o adiv_even.txt -t ../clustering/rep_set.tre
#gunzip table_even4753.biom.gz
#alpha_diversity.py -i table_even4753.biom --metrics chao1,observed_otus,shannon,PD_whole_tree -o adiv_even.txt -t ../clustering_stool/rep_set.tre
#gunzip table_even4753.biom.gz
#alpha_diversity.py -i table_even4753.biom --metrics chao1,observed_otus,shannon,PD_whole_tree -o adiv_even.txt -t ../clustering_swab/rep_set.tre
```

```{r, echo=TRUE, warning=FALSE}
#fig.width=9, fig.height=6,
#QIIME1 hmp.div_qiime <- read.csv("adiv_even.txt", sep="\t")
#QIIME1 colnames(hmp.div_qiime) <- c("sam_name", "chao1", "observed_otus", "shannon", "PD_whole_tree")
#QIIME1 row.names(hmp.div_qiime) <- hmp.div_qiime$sam_name
#QIIME1 div.df <- merge(hmp.div_qiime, hmp.meta, by = "sam_name")
#QIIME1 div.df2 <- div.df[, c("Group", "chao1", "shannon", "observed_otus", "PD_whole_tree")]
#QIIME1 colnames(div.df2) <- c("Group", "Chao-1", "Shannon", "OTU", "Phylogenetic Diversity")
#QIIME1 options(max.print=999999)
#QIIME1 #27     H47 830.5000 5.008482 319               10.60177
#QIIME1 #FITTING4: if occuring "Computation failed in `stat_signif()`:not enough 'y' observations"
#QIIME1 #means: the patient H47 contains only one sample, it should be removed for the statistical p-values calculations.
#QIIME1 #delete H47(1)
#QIIME1 #div.df2 <- div.df2[-c(3), ]
#QIIME1 #div.df2 <- div.df2[-c(55,54, 45,40,39,27,26,25,1), ]

# for QIIME2: Lesen der Metriken
shannon <- read.table("exported_alpha/shannon/alpha-diversity.tsv", header=TRUE, sep="\t")
faith_pd <- read.table("exported_alpha/faith_pd/alpha-diversity.tsv", header=TRUE, sep="\t")
observed <- read.table("exported_alpha/observed_features/alpha-diversity.tsv", header=TRUE, sep="\t")
#chao1 <- read.table("exported_alpha/chao1/alpha-diversity.tsv", header=TRUE, sep="\t")    #TODO: Check the correctness of chao1-calculation.

# Umbenennen für Klarheit
colnames(shannon) <- c("sam_name", "shannon")
colnames(faith_pd) <- c("sam_name", "PD_whole_tree")
colnames(observed) <- c("sam_name", "observed_otus")
#colnames(chao1) <- c("sam_name", "chao1")

# Merge alles in ein DataFrame
div.df <- Reduce(function(x, y) merge(x, y, by="sam_name"),
                                    list(shannon, faith_pd, observed))

# Meta-Daten einfügen
div.df <- merge(div.df, hmp.meta, by="sam_name")

# Reformat
div.df2 <- div.df[, c("sam_name", "Group", "shannon", "observed_otus", "PD_whole_tree")]
colnames(div.df2) <- c("Sample name", "Group", "Shannon", "OTU", "Phylogenetic Diversity")
write.csv(div.df2, file="alpha_diversities.txt")
knitr::kable(div.df2) %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))

#https://uc-r.github.io/t_test
#We can perform the test with t.test and transform our data and we can also perform the nonparametric test with the wilcox.test function.
stat.test.Shannon <- compare_means(
 Shannon ~ Group, data = div.df2,
 method = "t.test"
)
knitr::kable(stat.test.Shannon) %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))

div_df_melt <- reshape2::melt(div.df2)
#head(div_df_melt)

#https://plot.ly/r/box-plots/#horizontal-boxplot
#http://www.sthda.com/english/wiki/print.php?id=177
#https://rpkgs.datanovia.com/ggpubr/reference/as_ggplot.html
#http://www.sthda.com/english/articles/24-ggpubr-publication-ready-plots/82-ggplot2-easy-way-to-change-graphical-parameters/
#https://plot.ly/r/box-plots/#horizontal-boxplot
#library("gridExtra")
#par(mfrow=c(4,1))
p <- ggboxplot(div_df_melt, x = "Group", y = "value",
                            facet.by = "variable",
                            scales = "free",
                            width = 0.5,
                            fill = "gray", legend= "right")
#ggpar(p, xlab = FALSE, ylab = FALSE)
lev <- levels(factor(div_df_melt$Group)) # get the variables
#FITTING4: delete H47(1) in lev
#lev <- lev[-c(3)]
# make a pairwise list that we want to compare.
#my_stat_compare_means
#https://stackoverflow.com/questions/47839988/indicating-significance-with-ggplot2-in-a-boxplot-with-multiple-groups
L.pairs <- combn(seq_along(lev), 2, simplify = FALSE, FUN = function(i) lev[i]) #%>% filter(p.signif != "ns")
my_stat_compare_means  <- function (mapping = NULL, data = NULL, method = NULL, paired = FALSE,
        method.args = list(), ref.group = NULL, comparisons = NULL,
        hide.ns = FALSE, label.sep = ", ", label = NULL, label.x.npc = "left",
        label.y.npc = "top", label.x = NULL, label.y = NULL, tip.length = 0.03,
        symnum.args = list(), geom = "text", position = "identity",
        na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, ...)
{
        if (!is.null(comparisons)) {
                method.info <- ggpubr:::.method_info(method)
                method <- method.info$method
                method.args <- ggpubr:::.add_item(method.args, paired = paired)
                if (method == "wilcox.test")
                        method.args$exact <- FALSE
                pms <- list(...)
                size <- ifelse(is.null(pms$size), 0.3, pms$size)
                color <- ifelse(is.null(pms$color), "black", pms$color)
                map_signif_level <- FALSE
                if (is.null(label))
                        label <- "p.format"
                if (ggpubr:::.is_p.signif_in_mapping(mapping) | (label %in% "p.signif")) {
                        if (ggpubr:::.is_empty(symnum.args)) {
                                map_signif_level <- c(`****` = 1e-04, `***` = 0.001,
                                    `**` = 0.01, `*` = 0.05, ns = 1)
                        } else {
                             map_signif_level <- symnum.args
                        }
                        if (hide.ns)
                                names(map_signif_level)[5] <- " "
                }
                step_increase <- ifelse(is.null(label.y), 0.12, 0)
                ggsignif::geom_signif(comparisons = comparisons, y_position = label.y,
                        test = method, test.args = method.args, step_increase = step_increase,
                        size = size, color = color, map_signif_level = map_signif_level,
                        tip_length = tip.length, data = data)
        } else {
                mapping <- ggpubr:::.update_mapping(mapping, label)
                layer(stat = StatCompareMeans, data = data, mapping = mapping,
                        geom = geom, position = position, show.legend = show.legend,
                        inherit.aes = inherit.aes, params = list(label.x.npc = label.x.npc,
                                label.y.npc = label.y.npc, label.x = label.x,
                                label.y = label.y, label.sep = label.sep, method = method,
                                method.args = method.args, paired = paired, ref.group = ref.group,
                                symnum.args = symnum.args, hide.ns = hide.ns,
                                na.rm = na.rm, ...))
        }
}

# Rotate the x-axis labels to 45 degrees and adjust their position
p <- p + theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust=1, size=8))
#comparisons = list(c("Group1", "Group2"), c("Group3", "Group4")),
p2 <- p +
stat_compare_means(
    method="t.test",
    comparisons = list(),
    label = "p.signif",
    symnum.args <- list(cutpoints = c(0, 0.0001, 0.001, 0.01, 0.05, 1), symbols = c("****", "***", "**", "*", "ns"))
)
#comparisons = L.pairs,
#symnum.args <- list(cutpoints = c(0, 0.0001, 0.001, 0.01, 0.05), symbols = c("****", "***", "**", "*")),
#stat_pvalue_manual
print(p2)
#https://stackoverflow.com/questions/20500706/saving-multiple-ggplots-from-ls-into-one-and-separate-files-in-r
#FITTING3: mkdir figures
ggsave("./figures/alpha_diversity_Group.png", device="png", height = 10, width = 15)
ggsave("./figures/alpha_diversity_Group.svg", device="svg", height = 10, width = 15)

#NOTE: Run this Phyloseq.Rmd, then run the code of MicrobiotaProcess.R to manually generate PCoA.png, then run this Phyloseq.Rmd!
#NOTE: AT_FIRST_DEACTIVATE_THIS_LINE: knitr::include_graphics("./figures/PCoA.png")

```

```{r, echo=FALSE, warning=FALSE, fig.cap="Alpha diversity", out.width = '100%', fig.align= "center"}
## MANUALLY selected alpha diversities unter host-env after 'cp alpha_diversities.txt selected_alpha_diversities.txt'
#knitr::include_graphics("./figures/alpha_diversity_Group.png")
#selected_alpha_diversities<-read.csv("selected_alpha_diversities.txt",sep="\t")
#knitr::kable(selected_alpha_diversities) %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
```

# Beta diversity (Bray-Curtis distance)

## Group1 vs Group2
```{r, echo=FALSE, warning=FALSE, out.width = '100%', fig.align= "center"}
#fig.cap="Beta diversity",

#for QIIME1: file:///home/jhuang/DATA/Data_Marius_16S/core_diversity_e42369/bdiv_even42369_Group/weighted_unifrac_boxplots/Group_Stats.txt

# -- for QIIME2: MANUALLY filter permanova-pairwise.csv and save as permanova-pairwise_.csv
# #grep "Permutations" exported_beta_group/permanova-pairwise.csv > permanova-pairwise_.csv
# #grep "Group1,Group2" exported_beta_group/permanova-pairwise.csv >> permanova-pairwise_.csv
# #grep "Group3,Group4" exported_beta_group/permanova-pairwise.csv >> permanova-pairwise_.csv
# beta_diversity_group_stats<-read.csv("permanova-pairwise_.csv",sep=",")
# #beta_diversity_group_stats <- beta_diversity_group_stats[beta_diversity_group_stats$Group.1 == "Group1" & beta_diversity_group_stats$Group.2 == "Group2", ]
# #beta_diversity_group_stats <- beta_diversity_group_stats[beta_diversity_group_stats$Group.1 == "Group3" & beta_diversity_group_stats$Group.2 == "Group4", ]
# knitr::kable(beta_diversity_group_stats) %>% kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))

#NOTE: Run this Phyloseq.Rmd, then run the code of MicrobiotaProcess.R to manually generate Comparison_of_Bray_Distances_Group1_vs_Group2.png and Comparison_of_Bray_Distances_Group3_vs_Group4.png, then run this Phyloseq.Rmd!

#knitr::include_graphics("./figures/Comparison_of_Bray_Distances_Group1_vs_Group2.png")

```

## Group3 vs Group4
```{r, echo=FALSE, warning=FALSE, out.width = '100%', fig.align= "center"}
#knitr::include_graphics("./figures/Comparison_of_Bray_Distances_Group3_vs_Group4.png")
```

# The PCoA analysis

## Group1 vs Group2
```{r, echo=FALSE, warning=FALSE, out.width = '100%', fig.align= "center"}
#knitr::include_graphics("./figures/PCoA2_Group1_vs_Group2.png")
```

## Group3 vs Group4
```{r, echo=FALSE, warning=FALSE, out.width = '100%', fig.align= "center"}
#knitr::include_graphics("./figures/PCoA2_Group3_vs_Group4.png")
```

## Groups 1, 2, 3 and 4
```{r, echo=FALSE, warning=FALSE, out.width = '100%', fig.align= "center"}
#knitr::include_graphics("./figures/PCoA2_Group1-Group4.png")
```

## Groups 9,10, 11, 12,13, and 14
```{r, echo=FALSE, warning=FALSE, out.width = '100%', fig.align= "center"}
#knitr::include_graphics("./figures/PCoA2_Group9-Group14.png")
```

# Differential abundance analysis

Differential abundance analysis aims to find the differences in the abundance of each taxa between two groups of samples, assigning a significance value to each comparison.

## Group1 vs Group2

```{r, echo=TRUE, warning=FALSE}
#ps.ng.tax [ 2633 taxa and 136 samples] and ps.ng.tax_abund (absolute abundance)  [382 taxa and 136 samples],  ps.ng.tax_abund_rel (relative abundance)  [382 taxa and 136 samples], either ps.ng.tax and ps.ng.tax_abund can be used here!
ps.ng.tax_abund_sel1 <- data.table::copy(ps.ng.tax_abund)
otu_table(ps.ng.tax_abund_sel1) <- otu_table(ps.ng.tax_abund)[,c("sample-A1","sample-A2","sample-A3","sample-A8","sample-A9","sample-A10",   "sample-B10","sample-B11","sample-B12","sample-B13","sample-B14","sample-B15","sample-B16")]
diagdds = phyloseq_to_deseq2(ps.ng.tax_abund_sel1, ~Group)
diagdds$Group <- relevel(diagdds$Group, "Group2")
diagdds = DESeq(diagdds, test="Wald", fitType="parametric")
resultsNames(diagdds)

res = results(diagdds, cooksCutoff = FALSE)
alpha = 0.05
sigtab = res[which(res$padj < alpha), ]
sigtab = cbind(as(sigtab, "data.frame"), as(phyloseq::tax_table(ps.ng.tax_abund_sel1)[rownames(sigtab), ], "matrix"))
#sigtab <- sigtab[rownames(sigtab) %in% rownames(phyloseq::tax_table(ps.ng.tax_abund)), ]
kable(sigtab) %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))

library("ggplot2")
theme_set(theme_bw())
scale_fill_discrete <- function(palname = "Set1", ...) {
        scale_fill_brewer(palette = palname, ...)
}
x = tapply(sigtab$log2FoldChange, sigtab$Order, function(x) max(x))
x = sort(x)
sigtab$Order = factor(as.character(sigtab$Order), levels=names(x))
x = tapply(sigtab$log2FoldChange, sigtab$Family, function(x) max(x))
x = sort(x)
sigtab$Family = factor(as.character(sigtab$Family), levels=names(x))
ggplot(sigtab, aes(x=log2FoldChange, y=Family, color=Order)) + geom_point(aes(size=padj)) + scale_size_continuous(name="padj",range=c(8,4))+
    theme(axis.text.x = element_text(angle = -25, hjust = 0, vjust=0.5))
```

```{r, echo=FALSE, warning=FALSE, out.width = '100%', fig.align= "center"}
#knitr::include_graphics("./figures/diff_analysis_Group1_vs_Group2.png")
```

## Group3 vs Group4

```{r, echo=TRUE, warning=FALSE}
ps.ng.tax_abund_sel2 <- data.table::copy(ps.ng.tax_abund)
otu_table(ps.ng.tax_abund_sel2) <- otu_table(ps.ng.tax_abund)[,c("sample-C3","sample-C4","sample-C5","sample-C6","sample-C7",    "sample-E4","sample-E5","sample-E6","sample-E7","sample-E8")]
diagdds = phyloseq_to_deseq2(ps.ng.tax_abund_sel2, ~Group)
diagdds$Group <- relevel(diagdds$Group, "Group4")
diagdds = DESeq(diagdds, test="Wald", fitType="parametric")
resultsNames(diagdds)

res = results(diagdds, cooksCutoff = FALSE)
alpha = 0.05
sigtab = res[which(res$padj < alpha), ]
sigtab = cbind(as(sigtab, "data.frame"), as(phyloseq::tax_table(ps.ng.tax_abund_sel2)[rownames(sigtab), ], "matrix"))
write.xlsx(sigtab, file = "DEGs_Group3_vs_Group4.xlsx", rowNames = TRUE)

kable(sigtab) %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))

library("ggplot2")
theme_set(theme_bw())
scale_fill_discrete <- function(palname = "Set1", ...) {
        scale_fill_brewer(palette = palname, ...)
}
x = tapply(sigtab$log2FoldChange, sigtab$Order, function(x) max(x))
x = sort(x)
sigtab$Order = factor(as.character(sigtab$Order), levels=names(x))
x = tapply(sigtab$log2FoldChange, sigtab$Family, function(x) max(x))
x = sort(x)
sigtab$Family = factor(as.character(sigtab$Family), levels=names(x))
ggplot(sigtab, aes(x=log2FoldChange, y=Family, color=Order)) + geom_point(aes(size=padj)) + scale_size_continuous(name="padj",range=c(8,4))+
    theme(axis.text.x = element_text(angle = -25, hjust = 0, vjust=0.5))
```

```{r, echo=FALSE, warning=FALSE, out.width = '200%', fig.align= "center"}
#knitr::include_graphics("./figures/diff_analysis_Group3_vs_Group4.png")
```

## Group9 vs Group10

```{r, echo=TRUE, warning=FALSE}
ps.ng.tax_abund_sel2 <- data.table::copy(ps.ng.tax_abund)
otu_table(ps.ng.tax_abund_sel2) <- otu_table(ps.ng.tax_abund)[,c("sample-J1","sample-J2","sample-J3","sample-J4","sample-J10","sample-J11",    "sample-K7","sample-K8","sample-K9","sample-K10")]
diagdds = phyloseq_to_deseq2(ps.ng.tax_abund_sel2, ~Group)
diagdds$Group <- relevel(diagdds$Group, "Group10")
diagdds = DESeq(diagdds, test="Wald", fitType="parametric")
resultsNames(diagdds)

res = results(diagdds, cooksCutoff = FALSE)
alpha = 0.05
sigtab = res[which(res$padj < alpha), ]
sigtab = cbind(as(sigtab, "data.frame"), as(phyloseq::tax_table(ps.ng.tax_abund_sel2)[rownames(sigtab), ], "matrix"))
write.xlsx(sigtab, file = "DEGs_Group9_vs_Group10.xlsx", rowNames = TRUE)

kable(sigtab) %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))

library("ggplot2")
theme_set(theme_bw())
scale_fill_discrete <- function(palname = "Set1", ...) {
        scale_fill_brewer(palette = palname, ...)
}
x = tapply(sigtab$log2FoldChange, sigtab$Order, function(x) max(x))
x = sort(x)
sigtab$Order = factor(as.character(sigtab$Order), levels=names(x))
x = tapply(sigtab$log2FoldChange, sigtab$Family, function(x) max(x))
x = sort(x)
sigtab$Family = factor(as.character(sigtab$Family), levels=names(x))
ggplot(sigtab, aes(x=log2FoldChange, y=Family, color=Order)) + geom_point(aes(size=padj)) + scale_size_continuous(name="padj",range=c(8,4))+
    theme(axis.text.x = element_text(angle = -25, hjust = 0, vjust=0.5))
```

```{r, echo=FALSE, warning=FALSE, out.width = '200%', fig.align= "center"}
#knitr::include_graphics("./figures/diff_analysis_Group3_vs_Group4.png")
```

```{r, echo=FALSE, warning=FALSE}
## The table below shows the raw counts of the 199 OTUs across all samples, with OTUs as rows and samples as columns.
#kable(otu_table(ps.ng.tax)) %>%
#kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
```

```{r, echo=FALSE, warning=FALSE}
## The table below shows the taxonomic assignments of the 199 OTUs, with OTUs as rows and their corresponding taxonomic ranks as columns.
# ~/Tools/csv2xls-0.4/csv_to_xls.py otu_table.csv tax_table.csv -d',' -o otu_tax.xls;
#kable(taxonomy_df) %>%
#  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
```

```{r, echo=FALSE, warning=FALSE}
## The sample L9 retained only 413 sequences after the complete preprocessing workflow, which includes filtering, denoising, merging, and chimera removal and was excluded from downstream analyses.
# # Read the TSV file
# ~/Tools/csv2xls-0.4/csv_to_xls.py denoising-stats.csv -d$'\t' -o preprocessing_stats.xls;
# denoising_stats <- read.csv("denoising-stats.csv", sep="\t")
# # Display the table
# kable(denoising_stats, caption = "Preprocessing statistics for each sample") %>%
#   kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"))
```

CRISPR-Cas9 脱靶检测方法的总结

Link: https://www.cd-genomics.com/summary-of-crispr-cas9-off-target-detection-methods.html

快速概览

01 CRISPR-Cas9 脱靶检测的测序方法
02 CRISPR-Cas9 脱靶检测的计算模拟方法

基因组编辑技术处于当前生命科学研究的前沿。然而,要成功将其转化为临床应用,准确检测脱靶效应至关重要。正确评估和减轻脱靶效应是一个紧迫的问题。CRISPR-Cas9 基因编辑技术中的脱靶效应问题一直是长期关注的焦点。检测 CRISPR-Cas9 脱靶效应的主要方法有两种:计算模拟方法和测序方法 [1]。

CRISPR-Cas9 脱靶检测的测序方法

全基因组测序 (WGS)

全基因组测序 (WGS) 在评估 Cas9 诱导的脱靶突变方面与最小的评估偏差相关联。目前,通常采用 30-60x 的测序深度。然而,WGS 成本较高,较低的测序深度可能仅测序少量克隆,可能错过大多数低频脱靶事件。对于体内分析,WGS 仍是首选方法,但直接捕获双链断裂 (DSB) 的技术,如 BLESS,可能比 WGS 提供更优越的能力。这是因为 WGS 还会捕获细胞/动物模型之间自然发生的变异,这可能使分析复杂化并导致误导性结果。

在 WGS 分析中,选择适当的对照组尤为重要。为了在 WGS 中最小化假阳性和假阴性,通常需要设置多个组,这既费力又昂贵。

ChIP-Seq

Cas 核酸酶,一类蛋白质,可以通过抗体拉下后进行测序,称为 ChIP-Seq。ChIP-Seq 常用于检测与 dCas9 相关的脱靶效应。与常规 Cas9 相比,常规 Cas9 会切断目标序列,导致其与 DNA 序列解离并结合不稳定,而 dCas9 因核酸酶活性受损,仍能通过 gRNA 引导结合目标序列。因此,dCas9 常用于 CRISPR 激活 (CRISPRa) 以增强基因表达,而非用于基因敲除。

DISCOVER-seq(也称为 MRE11 ChIP-Seq)是 CRISPR-Cas9 脱靶测序的最新开发方法。该方法利用内源性 DNA 修复因子 MRE11 的招募来识别整个基因组上 Cas 诱导的双链断裂。在 DNA 修复过程中,MRE11 精确地招募到 DSB 发生部位。因此,通过拉下 MRE11 结合位点并进行高通量测序,该方法允许同时检查靶向和脱靶发生。重要的是,DISCOVER-seq 适用于体内和体外样本。

Cas 核酸酶切割位点和 DSB 位点富集测序

依赖富集 Cas 核酸酶结合或切割区域的测序方法通常被称为无偏检测方法。根据这一原理,已设计了富集方法,包括:

(1) 抗体拉下:

如 ChIP-Seq,使用抗体捕获目标区域。

(2) Cas 核酸酶切割位点富集:

Digenome-Seq,简称体外 Cas9 消化全基因组测序。Cas9 切割后留下 5′ 磷酸基团,便于接头连接以进行 PCR 扩增和后续 NGS 测序。在 Digenome-Seq 中,纯化的基因组 DNA (gDNA) 在体外用 Cas9 处理,随后进行接头连接和全面全基因组测序。此方法适用于体外样本。

(3) DNA 双链断裂区域 (DSB) 富集 – DSB 捕获:

在 BLESS-Seq 中,使用直接生物素亲和富集捕获 CRISPR-Cas9 引导的 DSB 片段,随后在接头连接后进行测序。生物素亲和富集专门捕获正在发生的 DSBs,已修复的 DSBs 未被考虑,因此被标记为“脱靶快照”。此方法常用于细胞和组织样本。

在 IDLV-Seq 中,整合缺陷慢病毒载体 (IDLV) 可作为 PCR 锚点来扩增通过非同源末端连接 (NHEJ) 生成的 DSB 位点,从而检测脱靶位点。然而,此方法的效率依赖于 IDLV 通过 NHEJ 整合到 DSB 的能力。此外,由于慢病毒的随机整合特性,可能出现假阳性。

HTGST 适用于检测 CRISPR-Cas9 诱导的染色体易位,但需注意的是,CRISPR-Cas9 诱导的脱靶事件主要导致插入缺失 (indels),相对较少见。此外,此方法仍受染色质可及性限制。

与富集核酸酶切割位点的方法相比,DSB 捕获方法更具生理相关性。然而,由于大多数 DSB 持续时间极短,它们的效率可能较低。IDLV 的体内标记和原位接头连接可能受切割位点附近局部染色质和序列组成的影响。因此,捕获方法可能存在偏差。

测序方法总结

多种测序方法可用,难以对每种方法进行详尽描述。以下表格提供了当前可访问的最全面总结。基于先前提供的信息,难以确定最佳方法。选择最合适的测序技术应根据实验的具体需求和研究团队的财务资源指导。

方法 适用场景 优点 局限性
WGS 体内分析 全面覆盖 成本高,易受自然变异干扰
ChIP-Seq dCas9 脱靶检测 针对性强 仅适用于特定蛋白结合
DISCOVER-seq 体内/体外 同时检测靶/脱靶 需要高分辨率测序
Digenome-Seq 体外样本 无偏检测 仅限体外应用
BLESS-Seq 细胞/组织 捕获活跃 DSB 效率低,短时效性
IDLV-Seq NHEJ 检测 特定性强 可能有假阳性
HTGST 染色体易位 检测易位 受染色质限制
summary-of-crispr-cas9-off-target-detection-methods-2

您可能感兴趣:

  • CRISPR 测序

  • CRISPR 筛选测序

  • CRISPR 脱靶验证

了解更多:

  • CRISPR 基因编辑评估和质量控制中的下一代测序

  • 下一代测序验证您的 CRISPR/Cas9 编辑

  • CRISPR 测序:简介、工作流程和应用

CRISPR-Cas9 脱靶检测的计算模拟方法

summary-of-crispr-cas9-off-target-detection-methods-3

这些技术旨在预测潜在脱靶序列,主要是由于目标序列与其他序列的相似性或引导 RNA (gRNA) 的有限特异性。潜在脱靶序列可以通过整合实验数据或使用计算机算法推导。为验证脱靶效应,通常依赖 PCR 产物测序。这些方法常称为“有偏”方法,脱靶预测工具的功能可分为两种主要机制:(1) 基于序列比对的模型和 (2) 基于算法打分的预测 [1]。

CRISPR-Cas9 脱靶检测的计算模拟方法

随着 CRISPR 技术的广泛使用,其应用预期也在提高。使用 CRISPR 技术时,实验设计可能缺乏额外对照组,这可能在后续实验中带来挑战。因此,建议在 CRISPR 用于基因编辑后及时进行脱靶分析,或保留早期样本。细胞和动物均易发生自发突变。

参考文献

  • Naeem, Muhammad et al. Latest Developed Strategies to Minimize the Off-Target Effects in CRISPR-Cas-Mediated Genome Editing. Cells vol. 2020
  • Ipek Tasan and Huimin Zhao. Targeting Specificity of the CRISPR/Cas9 System. ACS Synthetic Biology 2017
  • Wienert, B., Wyman, S.K., Yeh, C.D. et al. CRISPR off-target detection with DISCOVER-seq. Nat Protoc 15, 1775–1799 (2020)

Processing Data_Julia_RNASeq_SARS-CoV-2

  1. Preparing the directory trimmed. Note that the extension of input files is fastq.gz, the extension of output file is fq.gz.

    mkdir trimmed trimmed_unpaired;
    
    for sample_id in 01_PBS_1 02_PBS_2 03_PBS_3 04_rluc_1 05_rluc_2 06_rluc_3 07_ralpha_1 08_ralpha_2 09_ralpha_3 10_rBA2_1 11_rBA2_2 12_rBA2_3 13_rBA5_1 14_rBA5_2 15_rBA5_3 16_rdelta_1 17_rdelta_2 18_rdelta_3 19_rpirola_1 20_rpirola_2 21_rpirola_3; do
            java -jar /home/jhuang/Tools/Trimmomatic-0.36/trimmomatic-0.36.jar PE -threads 100 20250423_AV243904_0006_B/${sample_id}/${sample_id}_R1.fastq.gz 20250423_AV243904_0006_B/${sample_id}/${sample_id}_R2.fastq.gz trimmed/${sample_id}_R1.fq.gz trimmed_unpaired/${sample_id}_R1.fq.gz trimmed/${sample_id}_R2.fq.gz trimmed_unpaired/${sample_id}_R2.fq.gz ILLUMINACLIP:/home/jhuang/Tools/Trimmomatic-0.36/adapters/TruSeq3-PE-2.fa:2:30:10:8:TRUE LEADING:3 TRAILING:3 SLIDINGWINDOW:4:15 MINLEN:36 AVGQUAL:20; done 2> trimmomatic_pe.log;
    done
  2. Preparing samplesheet.csv

    sample,fastq_1,fastq_2,strandedness
    PBS_1,01_PBS_1_R1.fq.gz,01_PBS_1_R2.fq.gz,auto
    PBS_2,02_PBS_2_R1.fq.gz,02_PBS_2_R2.fq.gz,auto
    PBS_3,03_PBS_3_R1.fq.gz,03_PBS_3_R2.fq.gz,auto
    rLUC_1,04_rluc_1_R1.fq.gz,04_rluc_1_R2.fq.gz,auto
    rLUC_2,05_rluc_2_R1.fq.gz,05_rluc_2_R2.fq.gz,auto
    rLUC_3,06_rluc_3_R1.fq.gz,06_rluc_3_R2.fq.gz,auto
    rAlpha-N_1,07_ralpha_1_R1.fq.gz,07_ralpha_1_R2.fq.gz,auto
    rAlpha-N_2,08_ralpha_2_R1.fq.gz,08_ralpha_2_R2.fq.gz,auto
    rAlpha-N_3,09_ralpha_3_R1.fq.gz,09_ralpha_3_R2.fq.gz,auto
    rBA.2-N_1,10_rBA2_1_R1.fq.gz,10_rBA2_1_R2.fq.gz,auto
    rBA.2-N_2,11_rBA2_2_R1.fq.gz,11_rBA2_2_R2.fq.gz,auto
    rBA.2-N_3,12_rBA2_3_R1.fq.gz,12_rBA2_3_R2.fq.gz,auto
    rBA.5-N_1,13_rBA5_1_R1.fq.gz,13_rBA5_1_R2.fq.gz,auto
    rBA.5-N_2,14_rBA5_2_R1.fq.gz,14_rBA5_2_R2.fq.gz,auto
    rBA.5-N_3,15_rBA5_3_R1.fq.gz,15_rBA5_3_R2.fq.gz,auto
    rDelta-N_1,16_rdelta_1_R1.fq.gz,16_rdelta_1_R2.fq.gz,auto
    rDelta-N_2,17_rdelta_2_R1.fq.gz,17_rdelta_2_R2.fq.gz,auto
    rDelta-N_3,18_rdelta_3_R1.fq.gz,18_rdelta_3_R2.fq.gz,auto
    rPirola-N_1,19_rpirola_1_R1.fq.gz,19_rpirola_1_R2.fq.gz,auto
    rPirola-N_2,20_rpirola_2_R1.fq.gz,20_rpirola_2_R2.fq.gz,auto
    rPirola-N_3,21_rpirola_3_R1.fq.gz,21_rpirola_3_R2.fq.gz,auto
    
    mv trimmed/* .
  3. nextflow run

    'GRCh38' {
        fasta       = "/home/jhuang/Homo_sapiens/Ensembl/GRCh38/Sequence/WholeGenomeFasta/genome.fa"
        bwa         = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh38/Sequence/BWAIndex/version0.6.0/"
        bowtie2     = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh38/Sequence/Bowtie2Index/"
        star        = "/home/jhuang/Homo_sapiens/Ensembl/GRCh38/Sequence/STARIndex/"
        bismark     = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh38/Sequence/BismarkIndex/"
        gtf         = "/home/jhuang/Homo_sapiens/Ensembl/GRCh38/Annotation/Genes/genes.gtf"
        bed12       = "/home/jhuang/Homo_sapiens/Ensembl/GRCh38/Annotation/Genes/genes.bed"
        mito_name   = "chrM"
        macs_gsize  = "2.7e9"
        blacklist   = "/home/jhuang/Homo_sapiens/UCSC/hg38/blacklists/hg38-blacklist.bed"
    }
    
    #Example1: http://xgenes.com/article/article-content/157/prepare-virus-gtf-for-nextflow-run/
    #docker pull nfcore/rnaseq
    ln -s /home/jhuang/Tools/nf-core-rnaseq-3.12.0/ rnaseq
    
    # ---- SUCCESSFUL with directly downloaded gff3 and fasta from NCBI using docker after replacing 'CDS' with 'exon' ----
    #For Tam's bacteria: --fasta "/home/jhuang/DATA/Data_Tam_RNAseq_2024_AUM_MHB_Urine/CP059040.fasta" --gff "/home/jhuang/DATA/Data_Tam_RNAseq_2024_AUM_MHB_Urine/CP059040_m.gff"                    --gtf_group_features 'gene_id'  --gtf_extra_attributes 'gene_name' --featurecounts_group_type 'gene_biotype' --featurecounts_feature_type 'transcript'
    (host_env) /usr/local/bin/nextflow run rnaseq/main.nf -profile docker --input samplesheet.csv --genome GRCh38 --aligner 'star_salmon' --outdir results   --max_cpus 60 --max_memory 600.GB --max_time 2400.h   -resume
    #
    #--save_align_intermeds --save_unaligned --save_reference
  4. samplesheet.csv

    sample,fastq_1,fastq_2,strandedness
    PBS_1,01_PBS_1_R1.fq.gz,01_PBS_1_R2.fq.gz,auto
    PBS_2,02_PBS_2_R1.fq.gz,02_PBS_2_R2.fq.gz,auto
    PBS_3,03_PBS_3_R1.fq.gz,03_PBS_3_R2.fq.gz,auto
    rLUC_1,04_rluc_1_R1.fq.gz,04_rluc_1_R2.fq.gz,auto
    rLUC_2,05_rluc_2_R1.fq.gz,05_rluc_2_R2.fq.gz,auto
    rLUC_3,06_rluc_3_R1.fq.gz,06_rluc_3_R2.fq.gz,auto
    rAlpha-N_1,07_ralpha_1_R1.fq.gz,07_ralpha_1_R2.fq.gz,auto
    rAlpha-N_2,08_ralpha_2_R1.fq.gz,08_ralpha_2_R2.fq.gz,auto
    rAlpha-N_3,09_ralpha_3_R1.fq.gz,09_ralpha_3_R2.fq.gz,auto
    rBA.2-N_1,10_rBA2_1_R1.fq.gz,10_rBA2_1_R2.fq.gz,auto
    rBA.2-N_2,11_rBA2_2_R1.fq.gz,11_rBA2_2_R2.fq.gz,auto
    rBA.2-N_3,12_rBA2_3_R1.fq.gz,12_rBA2_3_R2.fq.gz,auto
    rBA.5-N_1,13_rBA5_1_R1.fq.gz,13_rBA5_1_R2.fq.gz,auto
    rBA.5-N_2,14_rBA5_2_R1.fq.gz,14_rBA5_2_R2.fq.gz,auto
    rBA.5-N_3,15_rBA5_3_R1.fq.gz,15_rBA5_3_R2.fq.gz,auto
    rDelta-N_1,16_rdelta_1_R1.fq.gz,16_rdelta_1_R2.fq.gz,auto
    rDelta-N_2,17_rdelta_2_R1.fq.gz,17_rdelta_2_R2.fq.gz,auto
    rDelta-N_3,18_rdelta_3_R1.fq.gz,18_rdelta_3_R2.fq.gz,auto
    rPirola-N_1,19_rpirola_1_R1.fq.gz,19_rpirola_1_R2.fq.gz,auto
    rPirola-N_2,20_rpirola_2_R1.fq.gz,20_rpirola_2_R2.fq.gz,auto
    rPirola-N_3,21_rpirola_3_R1.fq.gz,21_rpirola_3_R2.fq.gz,auto
  5. R-code for evaluation

    # Import the required libraries
    library("AnnotationDbi")
    library("clusterProfiler")
    library("ReactomePA")
    library(gplots)
    
    library(tximport)
    library(DESeq2)
    library(RColorBrewer)
    library(openxlsx)
    
    setwd("~/DATA/Data_Julia_RNASeq_SARS-CoV-2/results/star_salmon")
    
    # Define paths to your Salmon output quantification files, quant.sf refers to tx-counts, later will be summaried as gene-counts.
    files <- c("PBS_r1" = "./PBS_1/quant.sf",
                "PBS_r2" = "./PBS_2/quant.sf",
                "PBS_r3" = "./PBS_3/quant.sf",
                "rLUC_r1" = "./rLUC_1/quant.sf",
                "rLUC_r2" = "./rLUC_2/quant.sf",
                "rLUC_r3" = "./rLUC_3/quant.sf",
                "rAlpha.N_r1" = "./rAlpha-N_1/quant.sf",
                "rAlpha.N_r2" = "./rAlpha-N_2/quant.sf",
                "rAlpha.N_r3" = "./rAlpha-N_3/quant.sf",
                "rBA.2.N_r1" = "./rBA.2-N_1/quant.sf",
                "rBA.2.N_r2" = "./rBA.2-N_2/quant.sf",
                "rBA.2.N_r3" = "./rBA.2-N_3/quant.sf",
                "rBA.5.N_r1" = "./rBA.5-N_1/quant.sf",
                "rBA.5.N_r2" = "./rBA.5-N_2/quant.sf",
                "rBA.5.N_r3" = "./rBA.5-N_3/quant.sf",
                "rDelta.N_r1" = "./rDelta-N_1/quant.sf",
                "rDelta.N_r2" = "./rDelta-N_2/quant.sf",
                "rDelta.N_r3" = "./rDelta-N_3/quant.sf",
                "rPirola.N_r1" = "./rPirola-N_1/quant.sf",
                "rPirola.N_r2" = "./rPirola-N_2/quant.sf",
                "rPirola.N_r3" = "./rPirola-N_3/quant.sf")
    
    # ---- tx-level count data ----
    # Import the transcript abundance data with tximport
    txi <- tximport(files, type = "salmon", txIn = TRUE, txOut = TRUE)
    
    # Define the replicates and condition of the samples
    #replicate <- factor(c("r1", "r2", "r1", "r2", "r1", "r2", "r1", "r2", "r1", "r2"))
    #condition <- factor(c("PBS", "PBS", "PBS",  "rLUC", "rLUC", "rLUC",  "rAlpha.N", "rAlpha.N", "rAlpha.N",  "rBA.2.N", "rBA.2.N", "rBA.2.N",  "rBA.5.N", "rBA.5.N", "rBA.5.N",  "rDelta.N", "rDelta.N", "rDelta.N",  "rPirola.N", "rPirola.N", "rPirola.N"))
    condition <- factor(c("PBS", "PBS", "PBS",  "rLUC", "rLUC", "rLUC",  "rAlpha-N", "rAlpha-N", "rAlpha-N",  "rBA.2-N", "rBA.2-N", "rBA.2-N",  "rBA.5-N", "rBA.5-N", "rBA.5-N",  "rDelta-N", "rDelta-N", "rDelta-N",  "rPirola-N", "rPirola-N", "rPirola-N"))
    
    # Define the colData for DESeq2
    colData <- data.frame(condition=condition, row.names=names(files))
    
    # Create DESeqDataSet object
    dds <- DESeqDataSetFromTximport(txi, colData=colData, design=~condition)
    
    # In the context of your new code which is using tximport and DESeq2, you don't necessarily need this step. The reason is that DESeq2 performs its own filtering of low-count genes during the normalization and differential expression steps.
    # Filter data to retain only genes with more than 2 counts > 3 across all samples
    # dds <- dds[rowSums(counts(dds) > 3) > 2, ]
    
    # Output raw count data to a CSV file
    write.csv(counts(dds), file="transcript_counts.csv")
    
    # ---- gene-level count data ----
    # Read in the tx2gene map from salmon_tx2gene.tsv
    #tx2gene <- read.csv("salmon_tx2gene.tsv", sep="\t", header=FALSE)
    tx2gene <- read.table("salmon_tx2gene.tsv", header=FALSE, stringsAsFactors=FALSE)
    
    # Set the column names
    colnames(tx2gene) <- c("transcript_id", "gene_id", "gene_name")
    
    # Remove the gene_name column if not needed
    tx2gene <- tx2gene[,1:2]
    
    # Import and summarize the Salmon data with tximport
    txi <- tximport(files, type = "salmon", tx2gene = tx2gene, txOut = FALSE)
    
    # Continue with the DESeq2 workflow as before...
    colData <- data.frame(condition=condition, row.names=names(files))
    dds <- DESeqDataSetFromTximport(txi, colData=colData, design=~condition)
    #dds <- dds[rowSums(counts(dds) > 3) > 2, ]    #60605-->26543
    dds <- DESeq(dds)
    rld <- rlogTransformation(dds)
    write.csv(counts(dds, normalized=FALSE), file="gene_counts.csv")
    
    #TODO: why a lot of reads were removed due to the too_short?
    #STAR --runThreadN 4 --genomeDir /path/to/GenomeDir --readFilesIn /path/to/read1.fastq /path/to/read2.fastq --outFilterMatchNmin 50 --outSAMtype BAM SortedByCoordinate --outFileNamePrefix /path/to/output
    
    dim(counts(dds))
    head(counts(dds), 10)
  6. (Optional) draw 3D PCA plots.

    library(gplots)
    library("RColorBrewer")
    
    library(ggplot2)
    data <- plotPCA(rld, intgroup=c("condition", "replicate"), returnData=TRUE)
    write.csv(data, file="plotPCA_data.csv")
    #calculate all PCs including PC3 with the following codes
    library(genefilter)
    ntop <- 500
    rv <- rowVars(assay(rld))
    select <- order(rv, decreasing = TRUE)[seq_len(min(ntop, length(rv)))]
    mat <- t( assay(rld)[select, ] )
    pc <- prcomp(mat)
    pc$x[,1:3]
    #df_pc <- data.frame(pc$x[,1:3])
    df_pc <- data.frame(pc$x)
    identical(rownames(data), rownames(df_pc)) #-->TRUE
    
    data$PC1 <- NULL
    data$PC2 <- NULL
    merged_df <- merge(data, df_pc, by = "row.names")
    #merged_df <- merged_df[, -1]
    row.names(merged_df) <- merged_df$Row.names
    merged_df$Row.names <- NULL  # remove the "name" column
    merged_df$name <- NULL
    merged_df <- merged_df[, c("PC1","PC2","PC3","PC4","PC5","PC6","PC7","PC8","PC9","PC10","group","condition","replicate")]
    write.csv(merged_df, file="merged_df_10PCs.csv")
    summary(pc)
    #0.5333  0.2125 0.06852
    
    draw_3D.py
  7. Draw 2D PCA plots.

    # -- pca --
    png("pca.png", 1200, 800)
    plotPCA(rld, intgroup=c("condition"))
    dev.off()
    
    # -- heatmap --
    png("heatmap.png", 1200, 800)
    distsRL <- dist(t(assay(rld)))
    mat <- as.matrix(distsRL)
    hc <- hclust(distsRL)
    hmcol <- colorRampPalette(brewer.pal(9,"GnBu"))(100)
    heatmap.2(mat, Rowv=as.dendrogram(hc),symm=TRUE, trace="none",col = rev(hmcol), margin=c(13, 13))
    dev.off()
  8. (Optional) estimate size factors

    > head(dds)
    class: DESeqDataSet
    dim: 6 10
    metadata(1): version
    assays(6): counts avgTxLength ... H cooks
    rownames(6): ENSG00000000003 ENSG00000000005 ... ENSG00000000460
      ENSG00000000938
    rowData names(34): baseMean baseVar ... deviance maxCooks
    colnames(10): control_r1 control_r2 ... HSV.d8_r1 HSV.d8_r2
    colData names(2): condition replicate
    
    #convert bam to bigwig using deepTools by feeding inverse of DESeq’s size Factor
    sizeFactors(dds)
    #NULL
    dds <- estimateSizeFactors(dds)
    sizeFactors(dds)
    
    normalized_counts <- counts(dds, normalized=TRUE)
    #write.table(normalized_counts, file="normalized_counts.txt", sep="\t", quote=F, col.names=NA)
    
    # ---- DEBUG sizeFactors(dds) always NULL, see https://support.bioconductor.org/p/97676/ ----
    nm <- assays(dds)[["avgTxLength"]]
    sf <- estimateSizeFactorsForMatrix(counts(dds), normMatrix=nm)
    
    assays(dds)$counts  # for count data
    assays(dds)$avgTxLength  # for average transcript length, etc.
    assays(dds)$normalizationFactors
    
    In normal circumstances, the size factors should be stored in the DESeqDataSet object itself and not in the assays, so they are typically not retrievable via the assays() function. However, due to the issues you're experiencing, you might be able to manually compute the size factors and assign them back to the DESeqDataSet.
    
    To calculate size factors manually, DESeq2 uses the median ratio method. Here's a very simplified version of how you could compute this manually:
    > assays(dds)
    List of length 6
    names(6): counts avgTxLength normalizationFactors mu H cooks
    
    To calculate size factors manually, DESeq2 uses the median ratio method. Here's a very simplified version of how you could compute this manually:
    
    geoMeans <- apply(assays(dds)$counts, 1, function(row) if (all(row == 0)) 0 else exp(mean(log(row[row != 0]))))
    sizeFactors(dds) <- median(assays(dds)$counts / geoMeans, na.rm = TRUE)
    
    # ---- DEBUG END ----
    
    #unter konsole
    #  control_r1  ...
    # 1/0.9978755  ...
    
    > sizeFactors(dds)
                        HeLa_TO_r1                      HeLa_TO_r2
                          0.9978755                       1.1092227
    
    1/0.9978755=1.002129023
    1/1.1092227=
    
    #bamCoverage --bam ../markDuplicates/${sample}Aligned.sortedByCoord.out.bam -o ${sample}_norm.bw --binSize 10 --scaleFactor  --effectiveGenomeSize 2864785220
    bamCoverage --bam ../markDuplicates/HeLa_TO_r1Aligned.sortedByCoord.out.markDups.bam -o HeLa_TO_r1.bw --binSize 10 --scaleFactor 1.002129023     --effectiveGenomeSize 2864785220
    bamCoverage --bam ../markDuplicates/HeLa_TO_r2Aligned.sortedByCoord.out.markDups.bam -o HeLa_TO_r2.bw --binSize 10 --scaleFactor  0.901532217        --effectiveGenomeSize 2864785220
  9. Differential expressed gene analyses

    #A central method for exploring differences between groups of segments or samples is to perform differential gene expression analysis.
    
    dds$condition <- relevel(dds$condition, "PBS")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("rLUC_vs_PBS","rAlpha.N_vs_PBS","rBA.2.N_vs_PBS","rBA.5.N_vs_PBS","rDelta.N_vs_PBS","rPirola.N_vs_PBS")
    
    dds$condition <- relevel(dds$condition, "rLUC")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("rAlpha.N_vs_rLUC","rBA.2.N_vs_rLUC","rBA.5.N_vs_rLUC","rDelta.N_vs_rLUC","rPirola.N_vs_rLUC")
    
    dds$condition <- relevel(dds$condition, "rAlpha-N")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("rBA.2.N_vs_rAlpha.N","rBA.5.N_vs_rAlpha.N","rDelta.N_vs_rAlpha.N","rPirola.N_vs_rAlpha.N")
    
    dds$condition <- relevel(dds$condition, "rBA.2-N")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("rBA.5.N_vs_rBA.2.N","rDelta.N_vs_rBA.2.N","rPirola.N_vs_rBA.2.N")
    
    dds$condition <- relevel(dds$condition, "rBA.5-N")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("rDelta.N_vs_rBA.5.N","rPirola.N_vs_rBA.5.N")
    
    dds$condition <- relevel(dds$condition, "rDelta-N")
    dds = DESeq(dds, betaPrior=FALSE)
    resultsNames(dds)
    clist <- c("rPirola.N_vs_rDelta.N")
    
    ##https://bioconductor.statistik.tu-dortmund.de/packages/3.7/data/annotation/
    #BiocManager::install("EnsDb.Mmusculus.v79")
    #library(EnsDb.Mmusculus.v79)
    #edb <- EnsDb.Mmusculus.v79
    
    #https://bioconductor.org/packages/release/bioc/vignettes/biomaRt/inst/doc/accessing_ensembl.html#selecting-an-ensembl-biomart-database-and-dataset
    #https://bioconductor.org/packages/release/bioc/vignettes/biomaRt/inst/doc/accessing_ensembl.html#selecting-an-ensembl-biomart-database-and-dataset
    library(biomaRt)
    listEnsembl()
    listMarts()
    #ensembl <- useEnsembl(biomart = "genes", mirror="asia")  # default is Mouse strains 104
    #ensembl <- useEnsembl(biomart = "ensembl", dataset = "mmusculus_gene_ensembl", mirror = "www")
    #ensembl = useMart("ensembl_mart_44", dataset="hsapiens_gene_ensembl",archive=TRUE, mysql=TRUE)
    #ensembl <- useEnsembl(biomart = "ensembl", dataset = "mmusculus_gene_ensembl", version="104")
    #ensembl <- useEnsembl(biomart = "ensembl", dataset = "hsapiens_gene_ensembl", version="86")
    #--> total 69, 27  GRCh38.p7 and 39  GRCm38.p4; we should take 104, since rnaseq-pipeline is also using annotation of 104!
    ensembl <- useEnsembl(biomart = "ensembl", dataset = "hsapiens_gene_ensembl", version="114")
    datasets <- listDatasets(ensembl)
    #--> total 202   80                         GRCh38.p13         107                            GRCm39
    #80                         GRCh38.p14
    #107                            GRCm39
    
    listEnsemblArchives()
    #            name     date                                 url version
    #1  Ensembl GRCh37 Feb 2014          https://grch37.ensembl.org  GRCh37
    #2     Ensembl 114 May 2025 https://may2025.archive.ensembl.org     114
    #3     Ensembl 113 Oct 2024 https://oct2024.archive.ensembl.org     113
    #4     Ensembl 112 May 2024 https://may2024.archive.ensembl.org     112
    #5     Ensembl 111 Jan 2024 https://jan2024.archive.ensembl.org     111
    #6     Ensembl 110 Jul 2023 https://jul2023.archive.ensembl.org     110
    #7     Ensembl 109 Feb 2023 https://feb2023.archive.ensembl.org     109
    
    attributes = listAttributes(ensembl)
    attributes[1:25,]
    
    #https://www.ncbi.nlm.nih.gov/grc/human
    #BiocManager::install("org.Mmu.eg.db")
    #library("org.Mmu.eg.db")
    #edb <- org.Mmu.eg.db
    #
    #https://bioconductor.statistik.tu-dortmund.de/packages/3.6/data/annotation/
    #EnsDb.Mmusculus.v79
    #> query(hub, c("EnsDb", "apiens", "98"))
    #columns(edb)
    
    #searchAttributes(mart = ensembl, pattern = "symbol")
    
    ##https://www.geeksforgeeks.org/remove-duplicate-rows-based-on-multiple-columns-using-dplyr-in-r/
    library(dplyr)
    library(tidyverse)
    #df <- data.frame (lang =c ('Java','C','Python','GO','RUST','Javascript',
                          'Cpp','Java','Julia','Typescript','Python','GO'),
                          value = c (21,21,3,5,180,9,12,20,6,0,3,6),
                          usage =c(21,21,0,99,44,48,53,16,6,8,0,6))
    #distinct(df, lang, .keep_all= TRUE)
    
    for (i in clist) {
    #i<-clist[1]
      contrast = paste("condition", i, sep="_")
      res = results(dds, name=contrast)
      res <- res[!is.na(res$log2FoldChange),]
      #geness <- AnnotationDbi::select(edb86, keys = rownames(res), keytype = "GENEID", columns = c("ENTREZID","EXONID","GENEBIOTYPE","GENEID","GENENAME","PROTEINDOMAINSOURCE","PROTEINID","SEQNAME","SEQSTRAND","SYMBOL","TXBIOTYPE","TXID","TXNAME","UNIPROTID"))
      #geness <- AnnotationDbi::select(edb86, keys = rownames(res), keytype = "GENEID", columns = c("GENEID", "ENTREZID", "SYMBOL", "GENENAME","GENEBIOTYPE","TXBIOTYPE","SEQSTRAND","UNIPROTID"))
      # In the ENSEMBL-database, GENEID is ENSEMBL-ID.
      #geness <- AnnotationDbi::select(edb86, keys = rownames(res), keytype = "GENEID", columns = c("GENEID", "SYMBOL", "GENEBIOTYPE"))  #  "ENTREZID", "TXID","TXBIOTYPE","TXSEQSTART","TXSEQEND"
      #geness <- geness[!duplicated(geness$GENEID), ]
    
      #using getBM replacing AnnotationDbi::select
      #filters = 'ensembl_gene_id' means the records should always have a valid ensembl_gene_ids.
      geness <- getBM(attributes = c('ensembl_gene_id', 'external_gene_name', 'gene_biotype', 'entrezgene_id', 'chromosome_name', 'start_position', 'end_position', 'strand', 'description'),
          filters = 'ensembl_gene_id',
          values = rownames(res),
          mart = ensembl)
      geness_uniq <- distinct(geness, ensembl_gene_id, .keep_all= TRUE)
    
      #merge by column by common colunmn name, in the case "GENEID"
      res$ENSEMBL = rownames(res)
      identical(rownames(res), geness_uniq$ensembl_gene_id)
      res_df <- as.data.frame(res)
      geness_res <- merge(geness_uniq, res_df, by.x="ensembl_gene_id", by.y="ENSEMBL")
      dim(geness_res)
      rownames(geness_res) <- geness_res$ensembl_gene_id
      geness_res$ensembl_gene_id <- NULL
      write.csv(as.data.frame(geness_res[order(geness_res$pvalue),]), file = paste(i, "all.txt", sep="-"))
      up <- subset(geness_res, padj<=0.05 & log2FoldChange>=2)
      down <- subset(geness_res, padj<=0.05 & log2FoldChange<=-2)
      write.csv(as.data.frame(up[order(up$log2FoldChange,decreasing=TRUE),]), file = paste(i, "up.txt", sep="-"))
      write.csv(as.data.frame(down[order(abs(down$log2FoldChange),decreasing=TRUE),]), file = paste(i, "down.txt", sep="-"))
    }
    
    #-- show methods of class DESeq2 --
    #x=capture.output(showMethods(class="DESeq2"))
    #unlist(lapply(strsplit(x[grep("Function: ",x,)]," "),function(x) x[2]))
  10. Volcano plots with automatically finding top_g

    #A canonical visualization for interpreting differential gene expression results is the volcano plot.
    library(ggrepel)
    
    #for i in rLUC_vs_PBS rAlpha.N_vs_PBS rBA.2.N_vs_PBS rBA.5.N_vs_PBS rDelta.N_vs_PBS rPirola.N_vs_PBS; do
    #for i in rAlpha.N_vs_rLUC rBA.2.N_vs_rLUC rBA.5.N_vs_rLUC rDelta.N_vs_rLUC rPirola.N_vs_rLUC; do
    #for i in rBA.2.N_vs_rAlpha.N rBA.5.N_vs_rAlpha.N rDelta.N_vs_rAlpha.N rPirola.N_vs_rAlpha.N; do
    #for i in rBA.5.N_vs_rBA.2.N rDelta.N_vs_rBA.2.N rPirola.N_vs_rBA.2.N; do
    #for i in rDelta.N_vs_rBA.5.N rPirola.N_vs_rBA.5.N; do
    for i in rPirola.N_vs_rDelta.N; do
        echo "geness_res <- read.csv(file = paste(\"${i}\", \"all.txt\", sep=\"-\"), row.names=1)"
    
        echo "geness_res\$Color <- \"NS or log2FC < 2.0\""
        echo "geness_res\$Color[geness_res\$pvalue < 0.05] <- \"P < 0.05\""
        echo "geness_res\$Color[geness_res\$padj < 0.05] <- \"P-adj < 0.05\""
        echo "geness_res\$Color[abs(geness_res\$log2FoldChange) < 2.0] <- \"NS or log2FC < 2.0\""
        echo "geness_res\$Color <- factor(geness_res\$Color, levels = c(\"NS or log2FC < 2.0\", \"P < 0.05\", \"P-adj < 0.05\"))"
        echo "write.csv(geness_res, \"${i}_with_Category.csv\")"
    
        echo "write.csv(geness_res, \"${i}_with_Category.csv\")"
        echo "openxlsx::write.xlsx(geness_res, file = \"${i}_with_Category.xlsx\")"
    
        echo "geness_res\$invert_P <- (-log10(geness_res\$pvalue)) * sign(geness_res\$log2FoldChange)"
        echo "top_g <- c()"
        echo "top_g <- c(top_g, \
            geness_res[, 'external_gene_name'][order(geness_res[, 'invert_P'], decreasing = TRUE)[1:100]], \
            geness_res[, 'external_gene_name'][order(geness_res[, 'invert_P'], decreasing = FALSE)[1:100]])"
        echo "top_g <- unique(top_g)"
    
        # Save filtered subset for optional export/debug
        echo "highlight_genes <- subset(geness_res, external_gene_name %in% top_g & pvalue < 0.05 & abs(geness_res\$log2FoldChange) >= 2.0)"
    
        echo "geness_res <- geness_res[, -1*ncol(geness_res)]"  # remove invert_P column
    
        echo "png(\"${i}.png\",width=1200, height=2000)"
        echo "ggplot(geness_res, \
            aes(x = log2FoldChange, y = -log10(pvalue), \
                color = Color, label = external_gene_name)) + \
            geom_vline(xintercept = c(2.0, -2.0), lty = \"dashed\") + \
            geom_hline(yintercept = -log10(0.05), lty = \"dashed\") + \
            geom_point() + \
            labs(x = \"log2(FC)\", y = \"Significance, -log10(P)\", color = \"Significance\") + \
            scale_color_manual(values = c(\"P-adj < 0.05\"=\"darkblue\",\"P < 0.05\"=\"lightblue\",\"NS or log2FC < 2.0\"=\"darkgray\"), \
                                guide = guide_legend(override.aes = list(size = 4))) + \
            scale_y_continuous(expand = expansion(mult = c(0,0.05))) + \
            geom_text_repel(data = highlight_genes, size = 4, point.padding = 0.15, color = \"black\", \
                            min.segment.length = .1, box.padding = .2, lwd = 2) + \
            theme_bw(base_size = 16) + \
            theme(legend.position = \"bottom\")"
        echo "dev.off()"
    done
    
    sed -i -e 's/Color/Category/g' *_Category.csv
    
    for i in rLUC_vs_PBS rAlpha.N_vs_PBS rBA.2.N_vs_PBS rBA.5.N_vs_PBS rDelta.N_vs_PBS rPirola.N_vs_PBS    rAlpha.N_vs_rLUC rBA.2.N_vs_rLUC rBA.5.N_vs_rLUC rDelta.N_vs_rLUC rPirola.N_vs_rLUC    rBA.2.N_vs_rAlpha.N rBA.5.N_vs_rAlpha.N rDelta.N_vs_rAlpha.N rPirola.N_vs_rAlpha.N    rBA.5.N_vs_rBA.2.N rDelta.N_vs_rBA.2.N rPirola.N_vs_rBA.2.N    rDelta.N_vs_rBA.5.N rPirola.N_vs_rBA.5.N    rPirola.N_vs_rDelta.N; do
      echo "~/Tools/csv2xls-0.4/csv_to_xls.py ${i}-all.txt ${i}-up.txt ${i}-down.txt -d$',' -o ${i}.xls;"
    done

It looks as if the viruses are indeed different, especially in terms of “response to virus/IFN induction” (yellow cluster in your heat map).

To get this even clearer, could you possibly now compare the viruses with each other? Initially, I think it would be best to compare each virus with rLUC,

  1. The question above has already been addressed in the previous two steps.

    e.g. rLUC vs rAlpha.N,    rLUC vs rDelta,N,    rLUC vs rBA2.N,    rLUC vs rBA5.N,    rLUC vs rPirola.N?
    # rAlpha.N_vs_rLUC.xls
    # rBA.2.N_vs_rLUC.xls
    # rBA.5.N_vs_rLUC.xls
    # rDelta.N_vs_rLUC.xls
    # rPirola.N_vs_rLUC.xls
  2. Clustering the genes and draw heatmap

    install.packages("gplots")
    library("gplots")
    
    for i in rLUC_vs_PBS rAlpha.N_vs_PBS rBA.2.N_vs_PBS rBA.5.N_vs_PBS rDelta.N_vs_PBS rPirola.N_vs_PBS    rAlpha.N_vs_rLUC rBA.2.N_vs_rLUC rBA.5.N_vs_rLUC rDelta.N_vs_rLUC rPirola.N_vs_rLUC    rBA.2.N_vs_rAlpha.N rBA.5.N_vs_rAlpha.N rDelta.N_vs_rAlpha.N rPirola.N_vs_rAlpha.N    rBA.5.N_vs_rBA.2.N rDelta.N_vs_rBA.2.N rPirola.N_vs_rBA.2.N    rDelta.N_vs_rBA.5.N rPirola.N_vs_rBA.5.N    rPirola.N_vs_rDelta.N; do
      echo "cut -d',' -f1-1 ${i}-up.txt > ${i}-up.id"
      echo "cut -d',' -f1-1 ${i}-down.txt > ${i}-down.id"
    done
    
    #    1 1457.2h_vs_1457.M10.2h-down.id
    #    1 1457.2h_vs_1457.M10.2h-up.id
    #   23 1457.2h_vs_uninfected.2h-down.id
    #   74 1457.2h_vs_uninfected.2h-up.id
    #  126 1457.3d_vs_1457.2h-down.id
    #   61 1457.3d_vs_1457.2h-up.id
    #    2 1457.3d_vs_1457.M10.3d-down.id
    #    2 1457.3d_vs_1457.M10.3d-up.id
    #   97 1457.3d_vs_uninfected.3d-down.id
    #   79 1457.3d_vs_uninfected.3d-up.id
    #   17 1457.M10.2h_vs_uninfected.2h-down.id
    #   82 1457.M10.2h_vs_uninfected.2h-up.id
    #  162 1457.M10.3d_vs_1457.M10.2h-down.id
    #   69 1457.M10.3d_vs_1457.M10.2h-up.id
    #  171 1457.M10.3d_vs_uninfected.3d-down.id
    #  124 1457.M10.3d_vs_uninfected.3d-up.id
    
    cat *.id | sort -u > ids
    #add Gene_Id in the first line, delete the ""
    GOI <- read.csv("ids")$Gene_Id  #739 genes
    RNASeq.NoCellLine <- assay(rld)
    
    # Defining the custom order
    #column_order <- c(
    #  "PBS_r1","PBS_r2","PBS_r3","rLUC_r1","rLUC_r2","rLUC_r3","rAlpha.N_r1","rAlpha.N_r2","rAlpha.N_r3","rBA.2.N_r1","rBA.2.N_r2","rBA.2.N_r3","rBA.5.N_r1","rBA.5.N_r2","rBA.5.N_r3","rDelta.N_r1","rDelta.N_r2","rDelta.N_r3","rPirola.N_r1","rPirola.N_r2","rPirola.N_r3"
    #)
    #RNASeq.NoCellLine_reordered <- RNASeq.NoCellLine[, column_order]
    #head(RNASeq.NoCellLine_reordered)
    
    # Update column names
    new_colnames <- c("PBS 1","PBS 2","PBS 3","rLUC 1","rLUC 2","rLUC 3","rAlpha-N 1","rAlpha-N 2","rAlpha-N 3","rBA.2-N 1","rBA.2-N 2","rBA.2-N 3","rBA.5-N 1","rBA.5-N 2","rBA.5-N 3","rDelta-N 1","rDelta-N 2","rDelta-N 3","rPirola-N 1","rPirola-N 2","rPirola-N 3")
    colnames(RNASeq.NoCellLine) <- new_colnames
    
    #clustering methods: "ward.D", "ward.D2", "single", "complete", "average" (= UPGMA), "mcquitty" (= WPGMA), "median" (= WPGMC) or "centroid" (= UPGMC).  pearson or spearman
    datamat = RNASeq.NoCellLine[GOI, ]
    write.csv(as.data.frame(datamat), file ="DEGs_heatmap_data.csv")
    
    hr <- hclust(as.dist(1-cor(t(datamat), method="pearson")), method="complete")
    hc <- hclust(as.dist(1-cor(datamat, method="spearman")), method="complete")
    mycl = cutree(hr, h=max(hr$height)/1.1)
    mycol = c("YELLOW", "DARKBLUE", "DARKORANGE", "DARKMAGENTA", "DARKCYAN", "DARKRED",  "MAROON", "DARKGREEN", "LIGHTBLUE", "PINK", "MAGENTA", "LIGHTCYAN","LIGHTGREEN", "BLUE", "ORANGE", "CYAN", "RED", "GREEN");
    mycol = mycol[as.vector(mycl)]
    #png("DEGs_heatmap.png", width=800, height=1000)
    png("DEGs_heatmap.png", width = 1200, height = 1500, res = 150)  # Higher res
    heatmap.2(as.matrix(datamat),Rowv=as.dendrogram(hr),Colv = NA, dendrogram = 'row',
                scale='row',trace='none',col=bluered(75),
                RowSideColors = mycol, labRow="", srtCol=30, keysize=0.72, cexRow = 2, cexCol = 1.4)
    dev.off()
    
    # Extract rows from datamat where the row names match the identifiers in subset_1
    
    #### cluster members #####
    subset_1<-names(subset(mycl, mycl == '1'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_1, ])  #402
    
    subset_2<-names(subset(mycl, mycl == '2'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_2, ])  #137
    
    subset_3<-names(subset(mycl, mycl == '3'))
    data <- as.data.frame(datamat[rownames(datamat) %in% subset_3, ])  #200
    
    # Initialize an empty data frame for the annotated data
    annotated_data <- data.frame()
    # Determine total number of genes
    total_genes <- length(rownames(data))
    # Loop through each gene to annotate
    for (i in 1:total_genes) {
        gene <- rownames(data)[i]
        result <- getBM(attributes = c('ensembl_gene_id', 'external_gene_name', 'gene_biotype', 'entrezgene_id', 'chromosome_name', 'start_position', 'end_position', 'strand', 'description'),
                        filters = 'ensembl_gene_id',
                        values = gene,
                        mart = ensembl)
        # If multiple rows are returned, take the first one
        if (nrow(result) > 1) {
            result <- result[1, ]
        }
        # Check if the result is empty
        if (nrow(result) == 0) {
            result <- data.frame(ensembl_gene_id = gene,
                                external_gene_name = NA,
                                gene_biotype = NA,
                                entrezgene_id = NA,
                                chromosome_name = NA,
                                start_position = NA,
                                end_position = NA,
                                strand = NA,
                                description = NA)
        }
        # Transpose expression values
        expression_values <- t(data.frame(t(data[gene, ])))
        colnames(expression_values) <- colnames(data)
        # Combine gene information and expression data
        combined_result <- cbind(result, expression_values)
        # Append to the final dataframe
        annotated_data <- rbind(annotated_data, combined_result)
        # Print progress every 100 genes
        if (i %% 100 == 0) {
            cat(sprintf("Processed gene %d out of %d\n", i, total_genes))
        }
    }
    
    # Save the annotated data to a new CSV file
    write.csv(annotated_data, "cluster1_YELLOW.csv", row.names=FALSE)
    write.csv(annotated_data, "cluster2_DARKBLUE.csv", row.names=FALSE)
    write.csv(annotated_data, "cluster3_DARKORANGE.csv", row.names=FALSE)
    #~/Tools/csv2xls-0.4/csv_to_xls.py cluster*.csv -d',' -o gene_clusters.xls