【问题标题】:Data.frame two list, each list contain different length of elementsData.frame 两个列表,每个列表包含不同长度的元素
【发布时间】:2019-11-30 19:22:30
【问题描述】:

我有一个包含两个变量列表的数据框。列表中的每个观察都包含不同长度的元素。例如,变量“accession”的第 4 个包含一个元素,但第 7 个包含两个元素。 current dataframe

我想创建一个新的数据框,将两个列表组合在一起,如下所示: final dataframe I want

谢谢你帮助我!

这是我目前拥有的数据框。

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
 
    

【问题讨论】:

    标签: r list dataframe variables rentrez


    【解决方案1】:

    更新

    根据 OP 的更新,一个选项是在 extract_from_esummary 中指定 simplify = FALSE 以返回为 list,然后从每个 list 和 rbind 中提取 first list 元素来创建单个数据框

    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
    

    一个选项是用NA 填充list 元素以保持两列中的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 转换为'long' 格式,然后unnest 'val' 列和spread 将它恢复为'wide' 格式

    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]))
    

    【讨论】:

    • 感谢您帮助我。根据你的例子。我希望结果看起来像# A tibble: 12 x 1 # accession title # # 1 A,B,C a,b,c,d,e # 2 A,B,D,E a, b,c # 3 A,B d.其中仅包含 3 个观察值。例如,#1 包含“A,B,C”表示加入,“a,b,c,d,e”表示标题。
    • @Rbeginnnnnner 你说你的数据是list 列。我通过花时间帮助您创建了一些示例。您甚至没有提供可重现的示例
    • 你的例子很清楚,这就是我现在面临的问题。但我希望看到的结果是把它变成一个数据框,只有 3 个观察而不是 12 个。有什么办法可以做到这一点吗?很抱歉回复晚了。
    • @Rbeginnnnnner 你为什么不用dput 和预期输出的小型可重复示例来更新你的帖子?
    • @Rbeginnnnnner 你的最终数据有更多行,不清楚你想如何组合/粘贴。但是,我想你也说过你想要一个 data.frame。我很迷惑。抱歉,我想我在这上面花了太多时间
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2018-07-26
    • 2016-09-16
    • 2020-08-03
    相关资源
    最近更新 更多