Qual a melhor forma de agregar fatores?

Eu tenho um banco com as variáveis cidade, fumo (1 = sim, 2 = não) e diversas outras, porém eu gostaria de criar um outro banco só com a cidade e a frequência de quem fuma ou não.

Exemplo
          cidade                  sim  não
1         aracaju               163  1843
2         belem                185   1824
3         belo horizonte     280  1727
4         boa vista             191  1828
5         brasilia                230  1780
6         campo grande      228  1782

Eu conseguir fazer de forma não muito elegante:
tabela <- aggregate(dados$fumante, by = list(dados$CIDADE),FUN = function(x) c(table(x)))
cidade <- data.frame(tabela)

Como fazer de forma mais elegante? 

Outra pergunta, gostaria de criar dento desse banco (cidade) uma variável que é o % de sim, como fazer?

Abraços

--
Sérgio Henrique Almeida da Silva Junior
Doutorando em Epidemiologia em Saúde Pública
Escola Nacional de Saúde Pública Sérgio Arouca - ENSP/FIOCRUZ
http://lattes.cnpq.br/1611345552843383
Tel: (21) 94429486/78101651 id: 123*20942