readr - как обновить объект col_spec из spec()
Мне нравится рабочий процесс, касающийся спецификаций столбцов, как описано в этом сообщении в блоге RStudio. По сути, можно получить спецификацию столбца после read_csv
импортировать, а затем сохранить его для последующего использования. Например, из этого поста:
mtcars2 <- read_csv(readr_example("mtcars.csv"))
#> Parsed with column specification:
#> cols(
#> mpg = col_double(),
#> cyl = col_integer(),
#> disp = col_double(),
#> hp = col_integer(),
#> drat = col_double(),
#> wt = col_double(),
#> qsec = col_double(),
#> vs = col_integer(),
#> am = col_integer(),
#> gear = col_integer(),
#> carb = col_integer()
#> )
# Once you've figured out the correct types
mtcars_spec <- write_rds(spec(mtcars2), "mtcars2-spec.rds")
# Every subsequent load
mtcars2 <- read_csv(
readr_example("mtcars.csv"),
col_types = read_rds("mtcars2-spec.rds")
)
К сожалению, сами объекты спецификации представляют собой списки с атрибутами, но они не соответствуют различным спецификациям столбцов, указанным для read_csv
функция через col_types
параметр
> mtcars_spec$cols$cyl
<collector_integer>
> str(mtcars_spec$cols$cyl)
list()
- attr(*, "class")= chr [1:2] "collector_integer" "collector"
> class(mtcars_spec)
[1] "col_spec"
Кроме того, файлы.rds безобразны для редактирования в Windows (по крайней мере, для меня).
Я хотел бы иметь возможность редактировать большой col_spec
объект (скажем, пропустить определенные столбцы или иным образом редактировать класс). Я могу продолжать догадываться о строках, которые мне понадобятся для редактирования списка, вот так:
attr(mtcars_spec$cols$cyl,"class")[1] = "collector_skip"` # this worked!
> mtcars_spec
cols(
mpg = col_double(),
cyl = col_skip(),
disp = col_double(),
hp = col_integer(),
drat = col_double(),
wt = col_double(),
qsec = col_double(),
vs = col_integer(),
am = col_integer(),
gear = col_integer(),
carb = col_integer()
)
Но это кажется неловким. Есть ли более элегантный способ обновить классификации столбцов, скажем, как в моем примере, чтобы попытаться пропустить mtcars$cyl
столбец? Или, если не элегантный способ, способ, который охватывает все возможные типы? Я не хочу много гадать о том, как я буду реализовывать <collector_date>
с различными форматами даты.
1 ответ
Вот минимальная версия сообщения Джима Хестера на Github
library(readr)
test_spec <- spec_csv('x,y,theDate,skipCol
1,a,"21/01/2018", "skip1
2,z,"31/01/2018", "skip2')
test_spec
#> cols(
#> x = col_integer(),
#> y = col_character(),
#> theDate = col_character(),
#> skipCol = col_character()
#> )
test_spec$cols[["theDate"]] <- col_date("%d/%m/%Y")
test_spec$cols[["skipCol"]] <- col_skip()
test_spec
#> cols(
#> x = col_integer(),
#> y = col_character(),
#> theDate = col_date(format = "%d/%m/%Y"),
#> skipCol = col_skip()
#> )
Заметки
- Вам нужно знать формат даты ваших данных.
- Вы можете использовать readr::spec_csv() для файла