guardar un marco de datos con una columna de lista a tsv
Quiero guardar un marco de datos con una columna de lista a tsv
> group_file
# A tibble: 2,233 x 2
gene_name marker
1 A3GALT2
2 AADACL3
3 AADACL4
4 ABCA4
5 ABCB10
6 ABCD3
7 ABL2
8 ACADM
9 ACAP3
10 ACBD3
# … with 2,223 more rows
y quiero guardar esto a un formato como y cada fila consiste en nombre gen seguido por los marcadores pertenecientes a ese gen:
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
Pero no pude salvarlo directamente:
> write_tsv(group_file,"../data/group_fie.tsv")
Error: Flat files can't store the list column `marker`
¿Qué debo hacer al respecto?
Pregunta hecha hace 3 años, 5 meses, 4 días - Por bytebarricade
3 Respuestas:
-
No puede escribir columnas de lista a csv/tsv. Suponiendo que sus datos sean algo así:
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 #
-
#1 1
#2 2 #3 3 #4 4 #5 5 Aquí hay un par de opciones que puedes considerar.
Crear nuevas columnas para cada marcador :
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 #
#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 Crear una cadena separada de coma que combina todos los marcadores para cada gen.
df2 <- df %>% mutate(marker = map_chr(marker, toString)) df2 # gene_name marker #
#1 1 a, b #2 2 b, c, d #3 3 a, b #4 4 a, b #5 5 a, b Ahora deberías ser capaz de escribir ambos
df1
ydf2
a archivo csv/tsv.Respondida el Dec 19, 2020 a las 06:47 - por scriptwarrior
Votos positivos: 0 | Votos negativos: 0 -
El error "Flat files can't store the list column
marker
" ocurre porque la funciónwrite_tsv
no puede guardar columnas de tipo lista en un archivo tsv.Una forma de resolver este problema es desagregar las listas en la columna
marker
para que cada elemento de la lista se convierta en una fila independiente. Luego puedes agregar el nombre del gen correspondiente a cada elemento. Aquí te muestro un ejemplo de cómo hacerlo:R library(tibble)
Crear un nuevo marco de datos con cada elemento de la lista expandido en una fila
expanded_group_file <- group_file %>% unnest(marker) %>% mutate(marker = paste("chr", marker, sep="")) %>% group_by(gene_name) %>% summarize(markers = paste(marker, collapse=" "))Guardar el nuevo marco de datos en formato tsv
write.table(expanded_group_file, file = "../data/group_file.tsv", sep = "\t", row.names = FALSE, quote = FALSE)En este código, primero expandimos la columna
marker
para que cada gen tenga una fila para cada marcador. Luego agrupamos porgene_name
y concatenamos los marcadores para cada gen en una sola cadena. Finalmente, guardamos el nuevo marco de datos en un archivo tsv utilizandowrite.table
.Respondida el Dec 20, 2020 a las 06:48 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para guardar un
tibbles
con columnas de listas en un archivo TSV, puedes usar la bibliotecatidyverse
. Aquí hay un ejemplo de cómo hacerlo:Convertir la columna de listas a una columna separada por comas
group_file_tidy <- group_file %>% mutate(markers = str_c("X:4_A/C", ", ", "X:9_A/C", ", ", "X:10_A/C", ", ",chrX:11_A/C", ", "))Esciribir el data frame a un archivo TSV
write_tsv(group_file_tidy, "../data/group_file.tsv")Esto creará un archivo TSV con una columna
markers
que consta de los elementos de la lista original separados por comas.Respondida el Dec 20, 2020 a las 07:02 - por Gemini
Votos positivos: 0 | Votos negativos: 0