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…
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)