Olá pessoal,
Iniciando…
Para titulo de exemplo segue o banco de dados:
dados <- tibble::tribble(
~id, ~data,
"mma", "2021-12-22",
"mma", "2022-04-29",
"ffd", "2022-04-14",
"ffd", "2022-01-04",
"aad", "2022-01-12",
"aad", "2022-02-23",
"aad", "2022-06-15",
)
Veja que para a coluna id eu tenho repetições e há somente a diferença na coluna data. O que eu preciso fazer é:
Ter colunas de data para cada id.
# A tibble: 3 × 4
id data1 data2 data3
<chr> <chr> <chr> <chr>
1 mma 2021-12-22 2022-04-29 NA
2 ffd 2022-04-14 2022-01-04 NA
3 aad 2022-01-04 2022-02-23 2022-06-15
Tentei pelo tidyr utilizando seus recursos de pivotagem e não consegui. Alguém tem alguma ideia?
Uma solução que encontrei foi essa:
d3 <- dados %>%
dplyr::arrange(data) %>%
dplyr::group_by(id) %>%
dplyr::mutate(ordem_data = paste0('data',row_number())) %>%
dplyr::ungroup() %>%
dplyr::arrange(id) %>%
tidyr::pivot_wider(
names_from = 'ordem_data',
values_from = 'data')
Funcionou, mas gostaria de ter outras ideias para a solução desse problema.
Oi Fernanda.
Várias vezes eu tenho que fazer esse processo que precisa. Vou compartilhar como eu faço caso seja útil.
No meu caso, como eu nunca não sei ao certo quantas colunas eu vou precisar, eu vejo o número máximo e deixo a função separate()
do tidyr
resolver o resto. Aí ela dá um aviso pra informar o que fez quando tinha mais coluna do que valores para preencher. Isso pode ser controlado com os argumentos da função separate()
:
dados <- tibble::tribble(
~id, ~data,
"mma", "2021-12-22",
"mma", "2022-04-29",
"ffd", "2022-04-14",
"ffd", "2022-01-04",
"aad", "2022-01-12",
"aad", "2022-02-23",
"aad", "2022-06-15",
)
# aqui eu vejo o máximo de colunas que vou criar
dados |>
dplyr::count(id) |>
dplyr::slice_max(n)
#> # A tibble: 1 × 2
#> id n
#> <chr> <int>
#> 1 aad 3
dados |>
# primeiro eu agrego tudo
dplyr::summarise(nova = paste0(data, collapse = ","), .by = id) |>
# aí uso o máximo ali na função separate
tidyr::separate(nova, into = paste0("data", seq(1,3,1)), sep = ",")
#> Warning: Expected 3 pieces. Missing pieces filled with `NA` in 2 rows [1, 2].
#> # A tibble: 3 × 4
#> id data1 data2 data3
#> <chr> <chr> <chr> <chr>
#> 1 mma 2021-12-22 2022-04-29 <NA>
#> 2 ffd 2022-04-14 2022-01-04 <NA>
#> 3 aad 2022-01-12 2022-02-23 2022-06-15
Created on 2022-12-28 with reprex v2.0.2
É meio confuso, mas me ajuda. Gostei muito da sua solução inicial vou tentar usá-la também.
1 curtida
Ah. Percebi que precisa que as datas sejam organizadas neh? A função arrange()
ajuda de alguma forma. rs. mals.
1 curtida