Data.frame два списка, каждый список содержит различную длину элементов

У меня есть фрейм данных с двумя списками переменных. Каждое наблюдение в списке содержит различную длину элементов. Например, четвертая переменная "accession" содержит один элемент, а седьмая содержит два элемента. текущий фрейм данных

Я хочу сделать новый фрейм данных, объединяющий два списка, который выглядит следующим образом: конечный фрейм данных, который я хочу

Спасибо за помощь!

Это кадр данных, который у меня сейчас есть.

library(rentrez)


search <- entrez_search(db="gds", term=paste0("disease", " AND gse[ETYP]") , retMax = 15) 
id <- unlist(search$ids)
UID <- c(sapply(id, paste0, collapse=""))
pub.summary <- entrez_summary(db = "gds", id = UID ,  
                              always_return_list = TRUE)
summary <- extract_from_esummary(esummaries = pub.summary , 
                                           elements = c("samples"),
                                           simplify = T)
df <- data.frame(summary)
df <-data.frame(t(df))
df <- df %>% mutate()
df

Это результат фрейма данных, который я хочу получить

#  accession                                  title
#1 GSM3955152                                Cancer3
   GSM3955155                              Adjacent3
   GSM3955757 SW480 cells, HES1-binding RNAs/LncRNAs
   GSM3955153                              Adjacent1
   GSM3955150                                Cancer1
   GSM3955151                                Cancer2
#2 GSM33026213                      his4wk_sensitized_uti_1
   GSM3302681                         3his4wk_resolved_pbs_2
   GSM3302624                           c57bl6j_pbs_9
.
.
.
.
#4 GSM3955757                      SW480 cells, HES1-binding RNAs/LncRNAs
.
.
.
.
#15 GSM3934992                    control rep4 [N_0039]
    GSM3935006                    control rep15 [W_010]
    GSM3935012                    control rep17 [W_023]
    GSM3934989                    control rep1 [N_0026]
END
 
    

1 ответ

Обновить

Основываясь на обновлениях ФП, можно указать simplify = FALSE в extract_from_esummary вернуться как listзатем извлеките firstlist элемент от каждого list а также rbind создать один кадр данных

summary <- extract_from_esummary(esummaries = pub.summary , 
                                           elements = "samples",
                                           simplify = FALSE)


out <- do.call(rbind, lapply(summary, `[[`, 1))
row.names(out) <- NULL
head(out)
#  accession                                  title
#1 GSM3955152                                Cancer3
#2 GSM3955155                              Adjacent3
#3 GSM3955757 SW480 cells, HES1-binding RNAs/LncRNAs
#4 GSM3955153                              Adjacent1
#5 GSM3955150                                Cancer1
#6 GSM3955151                                Cancer2

Вариант будет дополнить list элементы с NA чтобы сохранить length то же самое в обоих столбцах (если один имеет разную длину), а затем unnest

library(dplyr)
library(purrr)
df1 %>%
   mutate(n = pmax(lengths(accession), lengths(title))) %>% 
   mutate_at(vars(accession, title), ~ 
         map2(., n, ~ `length<-`(.x, .y))) %>% 
   select(-n) %>%
   unnest(cols = c(accession, title))
# A tibble: 12 x 2
#   accession title
#   <chr>     <chr>
# 1 A         a    
# 2 B         b    
# 3 C         c    
# 4 <NA>      d    
# 5 <NA>      e    
# 6 A         a    
# 7 B         b    
# 8 C         c    
# 9 D         <NA> 
#10 E         <NA> 
#11 A         d    
#12 B         <NA> 

Или вариант заключается в gather в "длинный" формат, то unnest столбец 'val' и spread обратно в "широкий" формат

library(tidyr)
df1 %>%
    mutate(rn = row_number()) %>% 
    gather(key, val, -rn) %>%
    unnest(val) %>%
    group_by(rn, key) %>% 
    mutate(i1 = row_number()) %>% 
    spread(key, val) %>% 
    ungroup %>% 
    select(-rn, -i1)

данные

df1 <- tibble(accession = list(LETTERS[1:3], LETTERS[1:5], LETTERS[1:2]), 
       title = list(letters[1:5], letters[1:3], letters[4]))
Другие вопросы по тегам