将(taxize)分类数据的嵌套列表转换为数据框

时间:2017-10-11 19:29:03

标签: r dplyr plyr

我有一些生物(微生物组)数据,其中我有一堆OTU,其单个名称在属和门级别之间的分类学分辨率不同。我试图得到一个比我给出的名字更低级别的分类表。

 testnames <- c("Prevotella", "Bacteroides", "Enterobacteriaceae")

我发现taxize是一个有用的包,用于提取我正在寻找的信息。

library("taxize")
reclass <- classification(testnames, db = 'ncbi')

这会得到一个数据框列表

看起来像这样: classification

可以这样输入R:

structure(list(Prevotella = structure(list(name = c("cellular organisms", 
"Bacteria", "FCB group", "Bacteroidetes/Chlorobi group", "Bacteroidetes", 
"Bacteroidia", "Bacteroidales", "Prevotellaceae", "Prevotella"
), rank = c("no rank", "superkingdom", "no rank", "no rank", 
"phylum", "class", "order", "family", "genus"), id = c("131567", 
"2", "1783270", "68336", "976", "200643", "171549", "171552", 
"838")), .Names = c("name", "rank", "id"), row.names = c(NA, 
-9L), class = "data.frame"), Bacteroides = structure(list(name = c("cellular organisms", 
"Bacteria", "FCB group", "Bacteroidetes/Chlorobi group", "Bacteroidetes", 
"Bacteroidia", "Bacteroidales", "Bacteroidaceae", "Bacteroides"
), rank = c("no rank", "superkingdom", "no rank", "no rank", 
"phylum", "class", "order", "family", "genus"), id = c("131567", 
"2", "1783270", "68336", "976", "200643", "171549", "815", "816"
)), .Names = c("name", "rank", "id"), row.names = c(NA, -9L), class = "data.frame"), 
    Enterobacteriaceae = structure(list(name = c("cellular organisms", 
    "Bacteria", "Proteobacteria", "Gammaproteobacteria", "Enterobacterales", 
    "Enterobacteriaceae"), rank = c("no rank", "superkingdom", 
    "phylum", "class", "order", "family"), id = c("131567", "2", 
    "1224", "1236", "91347", "543")), .Names = c("name", "rank", 
    "id"), row.names = c(NA, -6L), class = "data.frame")), .Names = c("Prevotella", 
"Bacteroides", "Enterobacteriaceae"))

我真的很想把事情变成一个数据框,我可以将其导入phyloseq作为分类表。例如。看起来像这样的东西:

  

名称Phylum Class Order Family Genus

     

Prevotella Bacteroidetes Bacteroidia Bacteroidales Prevotellaceae Prevotella

     

Bacteroides Bacteroidetes Bacteroidia Bacteroidales Bacteroidaceae Bacteroides

     

Enterobacteriaceae Proteobacteria Gammaproteobacteria Enterobacterales Enterobacteriaceae

当然,实现此目的的一种方法是创建一个循环,该循环将转到列表的每个元素,找到被调用的变量,即phylum,然后将其放入新的数据框中。也就是说,我觉得应该有更快的方式来应用这样的转换,使用像plyr或dplyr这样的东西。

我已经看到了一些似乎很接近的事情:

Converting nested list to dataframe

Turn a list of lists with unnamed entries into a data frame or a tibble

但他们似乎假设一个人不想保存的数据较少,并且每个元素的数据帧大小均匀。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

使用dplyrtidyr

library(dplyr)
library(tidyr)

tibble(names = names(list), list) %>% 
  unnest() %>% 
  filter(rank %in% c("phylum","class","order","family","genus")) %>% 
  select(-id) %>% 
  spread(rank, name) %>% 
  select(name = names, phylum, class, order, family, genus)

# A tibble: 3 × 6
                name         phylum               class            order             family       genus
*              <chr>          <chr>               <chr>            <chr>              <chr>       <chr>
1        Bacteroides  Bacteroidetes         Bacteroidia    Bacteroidales     Bacteroidaceae Bacteroides
2 Enterobacteriaceae Proteobacteria Gammaproteobacteria Enterobacterales Enterobacteriaceae        <NA>
3         Prevotella  Bacteroidetes         Bacteroidia    Bacteroidales     Prevotellaceae  Prevotella

这是做什么的:

  1. 使用列表名称和每个嵌套列表
  2. 创建一个tibble
  3. Unnest the lists
  4. 在排名列
  5. 中过滤所需的值
  6. 摆脱id列
  7. 将排名行分散到列中,并使用名称
  8. 中的值填充
  9. 选择所需的顺序,将名称重命名为名称。
相关问题