2014-11-25 12 views
8

Ho un insieme di dati come questo:Riassumendo per percentuale sottogruppo in R

group | subgroup | value 
------------------------ 
    A | a  | 1 
    A | b  | 4 
    A | c  | 2 
    A | d  | 1 
    B | a  | 1 
    B | b  | 2 
    B | c  | 3 

Quello che voglio è quello di ottenere la percentuale dei valori di ciascun sottogruppo all'interno di ciascun gruppo, vale a dire l'uscita dovrebbe essere:

group | subgroup | percent 
------------------------ 
    A | a  | 0.125 
    A | b  | 0.500 
    A | c  | 0.250 
    A | d  | 0.125 
    B | a  | 0.167 
    B | b  | 0.333 
    B | c  | 0.500 

Esempio per il gruppo A, sottogruppo A: il valore era 1, la somma dell'intero gruppo A è 8 (a = 1, b = 4, c = 2, d = 1) - quindi 1/8 = 0,125

Finora ho trovato solo aggregati piuttosto semplici come this, ma non riesco a capire come eseguire la parte "dividi per somma in un sottogruppo".

risposta

13

Per il tuo commento, se i sottogruppi sono unici si può fare

library(dplyr) 
group_by(df, group) %>% mutate(percent = value/sum(value)) 
# group subgroup value percent 
# 1  A  a  1 0.1250000 
# 2  A  b  4 0.5000000 
# 3  A  c  2 0.2500000 
# 4  A  d  1 0.1250000 
# 5  B  a  1 0.1666667 
# 6  B  b  2 0.3333333 
# 7  B  c  3 0.5000000 

o per rimuovere la colonna value e aggiungere la colonna percent, allo stesso tempo, utilizzare transmute

group_by(df, group) %>% transmute(subgroup, percent = value/sum(value)) 
# group subgroup percent 
# 1  A  a 0.1250000 
# 2  A  b 0.5000000 
# 3  A  c 0.2500000 
# 4  A  d 0.1250000 
# 5  B  a 0.1666667 
# 6  B  b 0.3333333 
# 7  B  c 0.5000000 
Problemi correlati