Idiomatischer R-Code zum Partitionieren eines Vektors durch einen Index und Ausführen einer Operation auf dieser Partition

Ich versuche, den idiomatischen Weg in R zu finden, um einen numerischen Vektor durch einen Indexvektor zu partitionieren, die Summe aller Zahlen in dieser Partition zu finden und dann jeden einzelnen Eintrag durch diese Partitionssumme zu dividieren. Mit anderen Worten, wenn ich damit beginne:

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

Ich möchte, dass die Ausgabe einen Vektor erzeugt (nennen wir es z):

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

Wenn ich dies tun würde, ist SQL und könnte Fensterfunktionen verwenden, würde ich dies tun:

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

und wenn ich plyr verwenden würde, würde ich so etwas tun:

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

aber ich würde gerne wissen, wie man es mit den Standard-R-Werkzeugen zur funktionalen Programmierung wie mapply / aggregate usw. macht.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage