Pivot x Transpose

Oi gente, tudo bem?

Um amigo-anjo acabou me ajudando, mas queria deixar uma dúvida aqui para o caso de existir uma forma mais simples de resolver:

Tenho vários dataframes “iguais”: cada um tem três linhas com o mesmo nome, e duas colunas com seus próprios nomes. Eu precisava TRANSPOR as linhas pra virarem colunas e as colunas pra virarem linhas. Mas mantendo as informações de nomes de todas elas, pra depois fazer um bind_rows e juntar as seis tabelas em uma, por isso o pivot_longer e o pivot_wider não serviram.

Consegui resolver com esse código usando a função t:

 t %>% 
  data.frame() %>% 
  mutate(var = rownames(.)) %>% 
  slice(2:nrow(.))

Depois de juntar as tabelas eu renomeei as colunas.

A minha dúvida é se tem alguma função melhor que a t pra fazer isso, já que a t transforma o resultado numa matriz, daí preciso transformar em df, depois fazer outros ajustes.

Obrigada desde já =)

PS: Achei uma dúvida parecida que eu postei em 2020, vou deixar o link caso alguém queira entender melhor o pivot_longer com uma explicação bem simples do @dfalbel - Dúvida: transpor variáveis para linhas mantendo também as linhas originais

Carol,

Se você realmente precisa de uma transposição, acho que a melhor solução talvez seja a t() mesmo. Como você pode ver abaixo, a minha versão usando só funções tidy ficou até mais difícil de entender do que a sua.

# Tabela de exemplo
df1 <- data.frame(a = 1:3, b = 4:6, row.names = c("c", "d", "e"))
df1
#>   a b
#> c 1 4
#> d 2 5
#> e 3 6

df1 |>
  tibble::rownames_to_column("name") |>
  tidyr::pivot_longer(-name, names_to = "var") |>
  tidyr::pivot_wider() |>
  dplyr::slice(-1)
#> # A tibble: 1 × 4
#>   var       c     d     e
#>   <chr> <int> <int> <int>
#> 1 b         4     5     6

Created on 2023-02-01 with reprex v2.0.2

A única sugestão que eu faria em relação ao seu código é sobre o uso do . do pipe antigo, que já não é mais recomendado pelo pessoal do tidyverse. Talvez seja melhor (1) recorrer à rownames_to_column() ao invés do mutate() e (2) usar -1 ao invés de 2:nrow(.) na slice().

df1 |>
  t() |>
  data.frame() |>
  tibble::rownames_to_column("var") |>
  dplyr::slice(-1)
#>   var c d e
#> 1   b 4 5 6

Created on 2023-02-01 with reprex v2.0.2