【问题标题】:save a data frame with a list column to tsv将带有列表列的数据框保存到 tsv
【发布时间】:2021-03-29 17:11:58
【问题描述】:

我想将带有列表列的数据框保存到 tsv

> group_file
# A tibble: 2,233 x 2
   gene_name marker     
   <chr>     <list>     
 1 A3GALT2   <chr [81]> 
 2 AADACL3   <chr [91]> 
 3 AADACL4   <chr [132]>
 4 ABCA4     <chr [756]>
 5 ABCB10    <chr [219]>
 6 ABCD3     <chr [260]>
 7 ABL2      <chr [676]>
 8 ACADM     <chr [305]>
 9 ACAP3     <chr [121]>
10 ACBD3     <chr [200]>
# … with 2,223 more rows

我想将其保存为一种格式,每行由基因名称和属于该基因的标记组成:

GENE1   chrX:4_A/C  chrX:9_A/C  chrX:10_A/C chrX:11_A/C
GENE2   chrX:12_A/C chrX:14_A/C chrX:15_A/C chrX:17_A/C

但我无法直接保存:

> write_tsv(group_file,"../data/group_fie.tsv")
Error: Flat files can't store the list column `marker`

我该怎么办?

【问题讨论】:

    标签: r dataframe csv dplyr tibble


    【解决方案1】:

    您不能将列表列写入 csv/tsv。假设您的数据是这样的:

    df <- structure(list(gene_name = 1:5, marker = list(c("a", "b"), c("b", 
    "c", "d"), c("a", "b"), c("a", "b"), c("a", "b"))), row.names = c(NA, 
    -5L), class = c("tbl_df", "tbl", "data.frame"))
    df
    
    # A tibble: 5 x 2
    #    gene_name marker   
    #      <int> <list>   
    #1         1 <chr [2]>
    #2         2 <chr [3]>
    #3         3 <chr [2]>
    #4         4 <chr [2]>
    #5         5 <chr [2]>
    

    您可以考虑以下几个选项。

    为每个标记创建新列:

    library(tidyverse)
    
    df %>%
      unnest(marker) %>%
      group_by(gene_name) %>%
      mutate(col = paste0('col', row_number())) %>%
      pivot_wider(names_from = col, values_from = marker) %>%
      ungroup -> df1
    
    df1
    #  gene_name col1  col2  col3 
    #      <int> <chr> <chr> <chr>
    #1         1 a     b     NA   
    #2         2 b     c     d    
    #3         3 a     b     NA   
    #4         4 a     b     NA   
    #5         5 a     b     NA   
    

    创建一个逗号分隔的字符串,结合每个基因的所有标记。

    df2 <- df %>% mutate(marker = map_chr(marker, toString))
    df2
    
    #  gene_name marker 
    #      <int> <chr>  
    #1         1 a, b   
    #2         2 b, c, d
    #3         3 a, b   
    #4         4 a, b   
    #5         5 a, b   
    

    您现在应该能够将 df1df2 写入 csv/tsv 文件。

    【讨论】:

    • Ronak,在你的第二种方法中,我们可以做相反的事情。我的意思是,如果我们有一列以逗号分隔存储多个值,那么它可以转换为 list_col 吗?
    • 是的,您可以将数据拆分为列表列。 df2$b &lt;- strsplit(df2$marker, ',\\s*')
    猜你喜欢
    • 2018-06-09
    • 1970-01-01
    • 2016-08-19
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2018-06-05
    相关资源
    最近更新 更多