Recolher todas as colunas por uma coluna de ID [duplicada]

Esta pergunta já tem uma resposta aqui:

Recolher / concatenar / agregar uma coluna em uma única sequência separada por vírgula em cada grupo 2 respostas

Estou tentando fazer algo parecido com o que é respondido aqui, o que me deixa 80% do caminho. Eu tenho um quadro de dados com uma coluna de identificação e várias colunas de informações. Eu gostaria de enrolartodo das outras colunas para que haja apenas uma linha para cada ID e várias entradas sejam separadas por, por exemplo, um ponto e vírgula. Aqui está um exemplo do que tenho e do que quero.

TER

     ID  info1          info2
1 id101    one          first
2 id102   twoA second alias A
3 id102   twoB second alias B
4 id103 threeA  third alias A
5 id103 threeB  third alias B
6 id104   four         fourth
7 id105   five          fifth

QUER

     ID          info1                          info2
1 id101            one                          first
2 id102     twoA; twoB second alias A; second alias B
3 id103 threeA; threeB   third alias A; third alias B
4 id104           four                         fourth
5 id105           five                          fifth

Aqui está o código usado para gerar aqueles:

have <- data.frame(ID=paste0("id", c(101, 102, 102, 103, 103, 104, 105)),
                   info1=c("one", "twoA", "twoB", "threeA", "threeB", "four", "five"), 
                   info2=c("first", "second alias A", "second alias B", "third alias A", "third alias B", "fourth", "fifth"),
                   stringsAsFactors=FALSE)
want <- data_frame(ID=paste0("id", c(101:105)),
                   info1=c("one", "twoA; twoB", "threeA; threeB", "four", "five"), 
                   info2=c("first", "second alias A; second alias B", "third alias A; third alias B", "fourth", "fifth"),
                   stringsAsFactors=FALSE)

Essa questã fez basicamente a mesma pergunta, mas apenas uma única coluna "informações". Tenho várias outras colunas e gostaria de fazer isso para todas elas.

Pontos de bônus por fazer isso usando o dply

questionAnswers(5)

yourAnswerToTheQuestion