Código id idiomático para particionar um vetor por um índice e executar uma operação nessa partição

Eu estou tentando encontrar a maneira idiomática em R para particionar um vetor numérico por algum vetor de índice, encontrar a soma de todos os números nessa partição e, em seguida, dividir cada entrada individual por essa soma de partição. Em outras palavras, se eu começar com isso:

df <- data.frame(x = c(1,2,3,4,5,6), index = c('a', 'a', 'b', 'b', 'c', 'c'))

Eu quero que a saída crie um vetor (vamos chamá-lo z):

c(1/(1+2), 2/(1+2), 3/(3+4), 3/(3+4), 5/(5+6), 6/(5+6))  

Se eu estivesse fazendo isso é SQL e poderia usar funções de janela, eu faria isso:

select 
 x / sum(x) over (partition by index) as z 
from df

e se eu estivesse usando o plyr, faria algo assim:

ddply(df, .(index), transform, z = x / sum(x))

mas eu gostaria de saber como fazer isso usando as ferramentas de programação funcionais padrão R como mapply / aggregate etc.

questionAnswers(3)

yourAnswerToTheQuestion