es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo especificar los tipos de columna con abreviaciones al saltar columnas con read_csv.

Me gustaría leer en columnas seleccionadas de un archivo CSV, utilizando las abreviaciones compatibles con la función cols en el paquete readr. Sin embargo, cuando salto columnas, readr intenta adivinar el tipo de columna, en lugar de usar mi especificación, a menos que especifique las columnas por nombre o establezca un valor predeterminado.

Aquí hay un ejemplo reproducible:

library(tidyverse)

out <- tibble(a = c(1234, 5678),
       b = c(9876, 5432),
       c = c(4321, 8901))

write_csv(out, "test.csv")

test <- read_csv("test.csv",
                 col_select = c(a, c),
                 col_types = "cc")

typeof(test$c)

Puedo obtener la especificación correcta indicando explícitamente el nombre de la columna:

test2 <- read_csv("test.csv",
                 col_select = c(a, c),
                 col_types = c(a = "c", c = "c"))
typeof(test2$c)

También puedo obtener la especificación correcta estableciendo character como el valor predeterminado, como se sugiere en esta Q&A. Pero me pregunto si hay alguna manera de obtener la especificación correcta utilizando la abreviación “cc” o, alternativamente, cómo generar una cadena de abreviación en función de las columnas que se saltaron. Mi caso de uso real involucra un gran número de columnas saltadas, por lo que no quiero usar - o _ para especificar las columnas saltadas.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que cuando se utiliza el parámetro col_select para saltar columnas en read_csv, readr utiliza por defecto la adivinación del tipo de columna en lugar de usar la especificación col_types. Una manera de solucionarlo es indicar explícitamente el tipo de columna para cada columna seleccionada, como se muestra en el segundo fragmento de código del ejemplo anterior.

    Otra opción es establecer un tipo de columna por defecto utilizando cols() y utilizar el símbolo - para saltar columnas. Por ejemplo:

    test3 <- read_csv("test.csv",
                      col_types = cols(a = "c", b = "i", .default = "c", .cols_only = TRUE) - c)
    typeof(test3$c)
    #> [1] "character"
    

    En este código, cols() establece los tipos de columna de las columnas a y b de manera explícita, y establece un tipo por defecto de carácter para todas las demás columnas. El argumento .cols_only indica a read_csv que solo considere las columnas listadas en cols(), lo que significa que las columnas omitidas se les asignará el tipo predeterminado especificado en cols(). La parte - c especifica que la columna c debe ser saltada.

    Alternativamente, se podría escribir una función para generar la cadena col_types basada en las columnas que se saltaron, pero esto podría ser menos eficiente que usar -.

Comments are closed.