Tidyr, for ou dplyr

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