使用大型数据集创建嵌套列表的最佳方法是什么.

在下面的示例中,我想用分类级别域>王国>门>类>订单>家庭>属>种

因此,代码目前要经过每个分类级别,收集信息并填写列表,但由于数据量大,这个过程耗时太长,我想知道是否有办法优化这个过程.

代码附在下面.

非常感谢.


data <- data.frame(Reino   = c("reinoa","reinoa","reinob","reinoc"),
                   Filo    = c("Filoa1","Filoa2","Filob","Filoc"),
                   Clase   = c("Clasea1","Clase2","Claseb","Clasec"),
                   Orden   = c("Ordena1","Ordena2","Ordenb","Ordenc"),
                   Familia = c("Familiaa1","Familiaa2","Familiab","Familiac"),
                   Genero  = c("Generoa1","Generoa2","Generob","Generoc"),
                   Especie = c("Especiea1","Especiea2","Especieb","Especiec"))

for(i in unique(data$Reino)){
  
  dftaxonomica[[i]] <- list()
  
  print(i)
  
  for(j in unique(data[data$Reino==i,]$Filo)){
    
    dftaxonomica[[i]][[j]] <- list()
    
    for(w in unique(data[data$Reino==i & data$Filo==j,]$Clase)){
      
      dftaxonomica[[i]][[j]][[w]] <- list()
      
      
      for(z in unique(data[data$Reino==i & data$Filo==j & data$Clase == w,]$Orden)){
        
        dftaxonomica[[i]][[j]][[w]][[z]] <- list()
        
        for(h in unique(data[data$Reino==i & data$Filo==j & data$Clase == w & data$Orden == z,]$Familia)){
          
          dftaxonomica[[i]][[j]][[w]][[z]][[h]] <- list()
          
          for(q in unique(data[data$Reino==i & data$Filo==j & data$Clase == w & data$Orden == z & data$Familia == h,]$Genero)){
            
            dftaxonomica[[i]][[j]][[w]][[z]][[h]][[q]] <- list()
            
            for(k in unique(data[data$Reino==i & data$Filo==j & data$Clase == w & data$Orden == z & data$Familia == h & data$Género == h,]$Especie)){
              
              dftaxonomica[[i]][[j]][[w]][[z]][[h]][[q]][[k]] <- list()
              
              
              
              
            }
            
            
          } 
          
          
        }  
        
        
        
        
      }  
      
      
    }
    
    
    
    
    
  }
  
}


推荐答案

递归函数可能有助于:

recurse <- function(x) {
    nms <- names(x)
    if (length(nms) > 1L) {
        lapply(split(x[nms[-1L]], x[[nms[1L]]]), recurse)
    } else {
        nms <- unique(x[[1L]])
        setNames(vector("list", length(nms)), nms)
    }
}

recurse(data)
$reinoa
$reinoa$Filoa1
$reinoa$Filoa1$Clasea1
$reinoa$Filoa1$Clasea1$Ordena1
$reinoa$Filoa1$Clasea1$Ordena1$Familiaa1
$reinoa$Filoa1$Clasea1$Ordena1$Familiaa1$Generoa1
$reinoa$Filoa1$Clasea1$Ordena1$Familiaa1$Generoa1$Especiea1
NULL

$reinoa$Filoa2
$reinoa$Filoa2$Clase2
$reinoa$Filoa2$Clase2$Ordena2
$reinoa$Filoa2$Clase2$Ordena2$Familiaa2
$reinoa$Filoa2$Clase2$Ordena2$Familiaa2$Generoa2
$reinoa$Filoa2$Clase2$Ordena2$Familiaa2$Generoa2$Especiea2
NULL


$reinob
$reinob$Filob
$reinob$Filob$Claseb
$reinob$Filob$Claseb$Ordenb
$reinob$Filob$Claseb$Ordenb$Familiab
$reinob$Filob$Claseb$Ordenb$Familiab$Generob
$reinob$Filob$Claseb$Ordenb$Familiab$Generob$Especieb
NULL


$reinoc
$reinoc$Filoc
$reinoc$Filoc$Clasec
$reinoc$Filoc$Clasec$Ordenc
$reinoc$Filoc$Clasec$Ordenc$Familiac
$reinoc$Filoc$Clasec$Ordenc$Familiac$Generoc
$reinoc$Filoc$Clasec$Ordenc$Familiac$Generoc$Especiec
NULL


R相关问答推荐

R中具有gggplot 2的Likert图,具有不同的排名水平和显示百分比

如何使用R Shiny中的条件面板仅隐藏和显示用户输入,同时仍允许运行基础计算?

如何使用R中的dhrr函数将李克特量表的因子列从长转换为宽?

用derrr在R中查找组间的重复项

将向量组合到一个数据集中,并相应地命名行

如何使用STAT_SUMMARY向ggplot2中的密度图添加垂直线

多个过滤器内的一个盒子在仪表板Quarto

如何使用ggplot对堆叠条形图进行嵌套排序?

使用R中的正则表达式将一列分割为多列

将Posict转换为数字时的负时间(以秒为单位)

R中边际效应包中Logistic回归的交互作用风险比

您是否可以将组添加到堆叠的柱状图

查找所有站点的最小值

有没有办法定制Plot(allEffects())面板标题?

删除数据帧中特定行号之间的每第三行和第四行

ggplot斜体轴刻度标签中的单个字符-以前的帖子建议不工作

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

根据排名的顶点属性调整曲线图布局(&Q)

在直方图中显示两个变量

将y轴格式更改为R中的百分比