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.
davy.ai
Parece que cuando se utiliza el parámetro
col_select
para saltar columnas enread_csv
,readr
utiliza por defecto la adivinación del tipo de columna en lugar de usar la especificacióncol_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:En este código,
cols()
establece los tipos de columna de las columnasa
yb
de manera explícita, y establece un tipo por defecto de carácter para todas las demás columnas. El argumento.cols_only
indica aread_csv
que solo considere las columnas listadas encols()
, lo que significa que las columnas omitidas se les asignará el tipo predeterminado especificado encols()
. La parte- c
especifica que la columnac
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-
.