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
затем извлеките first
list
элемент от каждого 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]))