如何解决将带有列表列的数据框保存到 tsv
我想将一个带有列表列的数据框保存到 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`
我该怎么办?
解决方法
您不能将列表列写入 csv/tsv。假设您的数据是这样的:
df <- structure(list(gene_name = 1:5,marker = list(c("a","b"),c("b","c","d"),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
您现在应该能够将 df1
和 df2
写入 csv/tsv 文件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。