将列表嵌套到数据框中

问题描述 投票:0回答:1

我还没有找到适用于我的特定问题的示例,但如果需要,请随意标记为重复。

我有一个如下所示的嵌套列表:

nested_list <- list(
  ID1 = list(
    FEAT = list(
      feat1 = list(start = "1", end = "15", label = "CDR1"),
      feat2 = list(start = "20", end = "25", label = "CDR2")
    ),
    SEQ = "ACTGATCGTAGCTAGCTAGATGCTGATGTGTC"
  ),
  ID2 = list(
    SEQ = "ACTGATCGGCGGTGGCTAGCTGTGGGGCGCGCGACCGGGAAAA"
  )
)

我想获得这样的数据框:

   id  feat feat_label feat_start feat_end                                    full_seq
1 ID1 feat1       CDR1          1       15            ACTGATCGTAGCTAGCTAGATGCTGATGTGTC
2 ID1 feat2       CDR2         20       25            ACTGATCGTAGCTAGCTAGATGCTGATGTGTC
3 ID2  <NA>       <NA>         NA       NA ACTGATCGGCGGTGGCTAGCTGTGGGGCGCGCGACCGGGAAAA

as.data.frame(nested_list)
不会产生我想要的结果,因此可能需要额外的步骤将数据帧转换为“更长”的格式,最好使用类似
tidyr::pivot_longer()
的格式。

r dataframe list pivot
1个回答
0
投票

我认为这可以让你得到你想要的东西的本质。列顺序和列名称很容易调整。

nested_list <- list(
  ID1 = list(
    FEAT = list(
      feat1 = list(start = "1", end = "15", label = "CDR1"),
      feat2 = list(start = "20", end = "25", label = "CDR2")
    ),
    SEQ = "ACTGATCGTAGCTAGCTAGATGCTGATGTGTC"
  ),
  ID2 = list(
    SEQ = "ACTGATCGGCGGTGGCTAGCTGTGGGGCGCGCGACCGGGAAAA"
  )
)
library(purrr)

Unpack2 <- function(L) {
  map_dfr(L, .f = \(Row) unlist(Row))
}

Unpack1 <- function(NAME) {
  LIST <- nested_list[[NAME]]
  if(! is.null(LIST$FEAT)) {
    tmp <- LIST$FEAT
    Nms <- names(tmp)
    DF <- Unpack2(tmp)
    DF$feat <- Nms
  } else {
    DF <- data.frame(start = NA, end = NA, label = NA)
  }
  DF$ID <- NAME
  DF$Seq <- LIST$SEQ
  return(DF)
}

ListNames <- names(nested_list)
map_dfr(ListNames, Unpack1)
#> # A tibble: 3 × 6
#>   start end   label feat  ID    Seq                                        
#>   <chr> <chr> <chr> <chr> <chr> <chr>                                      
#> 1 1     15    CDR1  feat1 ID1   ACTGATCGTAGCTAGCTAGATGCTGATGTGTC           
#> 2 20    25    CDR2  feat2 ID1   ACTGATCGTAGCTAGCTAGATGCTGATGTGTC           
#> 3 <NA>  <NA>  <NA>  <NA>  ID2   ACTGATCGGCGGTGGCTAGCTGTGGGGCGCGCGACCGGGAAAA

创建于 2024 年 11 月 25 日,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.