我还没有找到适用于我的特定问题的示例,但如果需要,请随意标记为重复。
我有一个如下所示的嵌套列表:
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()
的格式。
我认为这可以让你得到你想要的东西的本质。列顺序和列名称很容易调整。
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