Após ler meus dados usando read_csv()
from readr , o comando spec()
retorna "especificação de coluna completa" para o tibble resultante:
> spec(steps)
cols(
duration = col_double(),
version_code = col_double(),
run_step = col_double(),
walk_step = col_double(),
start_time = col_datetime(format = ""),
sample_position_type = col_logical(),
custom = col_logical(),
update_time = col_datetime(format = ""),
create_time = col_datetime(format = ""),
count = col_double(),
speed = col_double(),
distance = col_double(),
calorie = col_double(),
time_offset = col_character(),
deviceuuid = col_character(),
pkg_name = col_character(),
end_time = col_datetime(format = ""),
datauuid = col_character(),
x = col_logical()
)
Mas se eu subdividir o tibble essa informação será perdida:
> spec(subset(steps, select = c(1, 5, 10, 11, 12, 17)))
NULL
Por quê? E como faço para mantê-lo?
Os dados para
spec()
são preenchidos quando são lidos ou importados e armazenados em um atributo do quadro. Por isso, você não os verá no console, a menos que procure especificamente por eles:Como os
dplyr
pacotes amigáveis gostam de reter esse tipo de informação, eles as reaplicam explicitamente quando o quadro é filtrado ou significativamente alterado. Algumas funções as mantêm (comofilter
) e outras não (select
):Filtrar ações com
dplyr::filter()
mantém a especificação, mas filtrar combase::subset(subset=)
não. A seleção de colunas emdplyr::select
funções como e não tidyversebase::subset(select=)
sempre (ou quase sempre?) removerá o"spec"
atributo.Se você precisar manter a especificação por algum motivo, armazene-a imediatamente após a leitura:
Não tenho certeza do porquê esse comportamento ocorre, mas é intencional e explicitamente definido no
readr
changelog . Se você olhar a versão 1.3, verá que ele afirma (ênfase minha):Você pode adicionar os
spec
atributos novamente usandoattr(subseted_df, "spec") <- attr(original_df, "spec")
- por exemplo:Dados