Linhas pra colunas

Oi pessoal, boa tarde!

Tenho um conjunto de dados que segue o seguinte padrão:
ID,palavras
1,palavra1
1,palavra2
1,palavra3
2,palavra1
2,palavra2
2,palavra3

São 3 palavras diferentes em cada ID. Preciso agrupá-las por ID e passar pra colunas, deixando dessa maneira:

1,palavra1,palavra2,palavra3
2,palavra1,palavra2,palavra3

Tentei utilizando o reshape2, mas ele me retornou um banco de dados gigante com cada palavra sendo o nome de uma coluna… e caso a palavra não pertencesse ao ID, ele me retornou 0… Não consegui deixá-los do jeito que preciso…

1 Curtida

Encontrei dois jeitos pra fazer isso.

PS: o pacote {tidyr} é a evolução do {reshape2}. As funções pivot_longer() e pivot_wider() são as novas melt() e cast().

library(tidyverse)

dados <- tribble(
  ~ID,~palavras,
  "1","palavra1",
  "1","palavra2",
  "1","palavra3",
  "2","palavra1",
  "2","palavra2",
  "2","palavra3",
  "2","palavra4"
)

# aquele com pivot_wider()
dados %>% pivot_wider(names_from = palavras, values_from = palavras)
#> # A tibble: 2 x 5
#>   ID    palavra1 palavra2 palavra3 palavra4
#>   <chr> <chr>    <chr>    <chr>    <chr>   
#> 1 1     palavra1 palavra2 palavra3 <NA>    
#> 2 2     palavra1 palavra2 palavra3 palavra4

# aquele com summarise() e unnest_wider()
dados %>% 
  group_by(ID) %>%
  summarise(palavras = list(palavras)) %>%
  unnest_wider(palavras)
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 2 x 5
#>   ID    ...1     ...2     ...3     ...4    
#>   <chr> <chr>    <chr>    <chr>    <chr>   
#> 1 1     palavra1 palavra2 palavra3 <NA>    
#> 2 2     palavra1 palavra2 palavra3 palavra4

Created on 2020-09-26 by the reprex package (v0.3.0)

3 Curtidas

Complementando a primeira alternativa de solução do Athos, usando pivot_wider, criando primeiramente os nomes das colunas do banco final, para que cada palavra diferente não vire uma coluna, como aconteceu quando você tentou.

library(tidyverse)

dados <- tribble(
  ~ID,~palavras,
  "1","palavra1",
  "1","palavra2",
  "1","palavra3",
  "2","palavra1",
  "2","palavra2",
  "2","palavra3",
  "2","palavra4"
)

dados

dados %>% 
  group_by(ID) %>%
  mutate(ordem_palavra = paste0("palavra",1:n())) %>% 
  ungroup() %>% 
  pivot_wider(names_from = ordem_palavra, values_from = palavras)
4 Curtidas

Obrigado @Athos e @lucianamorita :smiley:

1 Curtida