example_list = list(list(del=NULL, dup=NULL,inv=NULL),
list(del=data.frame(chromosome = c('Chr1','Chr2'), pos=c(125, 234),methods=c('Pindel','CVNator')), dup=NULL, inv=NULL),
list(del=NULL, dup=data.frame(chromosome = c('Chr1','Chr2'), pos=c(125, 234),methods=c('Delly','CVNator')), inv=NULL)
)
## what I want is:
chromsome pos methods type sammple
Chr1 125 Pindel del Sample2
Chr2 234 CVNator del Sample2
Chr1 125 Delly dup Sample3
Chr2 234 CVNator dup Sample2
###
library(dplyr)
library(tidyr)
example_list <- list(
list(del=NULL, dup=NULL, inv=NULL),
list(del=data.frame(chromosome = c('Chr1','Chr2'), pos=c(125, 234),methods=c('Pindel','CVNator')), dup=NULL, inv=NULL),
list(del=NULL, dup=data.frame(chromosome = c('Chr1','Chr2'), pos=c(125, 234),methods=c('Delly','CVNator')), inv=NULL)
)
names(example_list) <- c("Sample1", "Sample2", "Sample3")
flat_df <- bind_rows(lapply(names(example_list), function(sample_name) {
x <- example_list[[sample_name]]
if (!is.null(x$del)) {
del_df <- mutate(x$del, type = "del", sample = sample_name)
} else {
del_df <- data.frame(chromosome = character(0), pos = numeric(0), methods = character(0), type = character(0), sample = character(0))
}
if (!is.null(x$dup)) {
dup_df <- mutate(x$dup, type = "dup", sample = sample_name)
} else {
dup_df <- data.frame(chromosome = character(0), pos = numeric(0), methods = character(0), type = character(0), sample = character(0))
}
if (!is.null(x$inv)) {
inv_df <- mutate(x$inv, type = "inv", sample = sample_name)
} else {
inv_df <- data.frame(chromosome = character(0), pos = numeric(0), methods = character(0), type = character(0), sample = character(0))
}
bind_rows(del_df, dup_df, inv_df)
}))
# Print the resulting data frame
print(flat_df)
flat a nested list in R
最新推荐文章于 2024-07-02 14:30:13 发布