2017-09-08 3 views
1

Gibt es eine verfügbare Funktion, die diesen Code vereinfachen kann? Möchten den Anteil des sales von product in einer bestimmten week seinen Gesamtumsatz weißbedingter Anteil/relative Frequenz in R

library(dplyr) 

# Create data.frame 
df <- tribble(
    ~week, ~product, ~sales, 
    1L, "A",  40, 
    1L, "B",  20, 
    2L, "A",  50, 
    2L, "C",  10 
) 

# Total sales 
df_summ <- df %>% 
    group_by(product) %>% 
    summarise(total = sum(sales)) 

# Expected result 
df_prop <- df %>% 
    inner_join(df_summ) %>% 
    mutate(prop = sales/total) %>% 
    select(-sales, -total) # optional 

Ergebnis:

#> A tibble: 4 x 3 
#> week product  prop 
#> <int> <chr> <dbl> 
#>  1  A 0.444444 
#>  1  B 1.000000 
#>  2  A 0.555555 
#>  2  C 1.000000 
+0

Sie können auch verwenden: 'df%>% mutieren (prop = Umsatz/sum (Umsatz))' – Brian

+0

@ A5C1D2H2I1M1N2O1R2T1 ich den gewünschten Anteil falsch gelesen, du hast Recht. – Brian

+1

Sie können auch verwenden: 'df%>% group_by (Produkt)%>% muate (prop = Umsatz/Summe (Umsatz))' – Brian

Antwort

3

Es ist nicht klar, ob Ihre Frage über eine Funktion (in diesem Fall, Sie könnte nach prop.table) oder über einen Ansatz (wie die Aufteilung der Verkäufe mit der Summe der Verkäufe im selben Schritt) suchen.

Auf jeden Fall sollten Sie in der Lage sein, mit dem gewünschten Ausgang zu erhalten:

df %>% 
    group_by(product) %>% 
    mutate(prop = prop.table(sales)) %>% ## OR > mutate(prop = sales/sum(sales)) 
    select(-sales) 
# # A tibble: 4 x 3 
# # Groups: product [3] 
# week product  prop 
# <int> <chr>  <dbl> 
# 1  1  A 0.4444444 
# 2  1  B 1.0000000 
# 3  2  A 0.5555556 
# 4  2  C 1.0000000 

In Basis R, die Werte erhalten kann (aber in einem anderen Format) mit prop.table. Versuchen:

prop.table(xtabs(sales ~ product + week, df), 1) 
#  week 
# product   1   2 
#  A 0.4444444 0.5555556 
#  B 1.0000000 0.0000000 
#  C 0.0000000 1.0000000 

In der oben der xtabs Schritt Ihre Daten nur umformt, und dann verwenden Sie prop.table mit den Proportionen auf der Grundlage der Zeilensummen.

> xtabs(sales ~ product + week, df) 
     week 
product 1 2 
     A 40 50 
     B 20 0 
     C 0 10 
+0

Sie können 'data.frame (prop.table (xtabs (Umsatz ~ Produkt + Woche , df), 1)), um es neu zu ordnen – Onyambu

2

Es kann mit dem data.table Paket eine kurze Linie sein:

setDT(df)[, prop:=sales/sum(sales), by=product] 

Ausgang:

week product sales  prop 
1: 1L  A 40 0.4444444 
2: 1L  B 20 1.0000000 
3: 2L  A 50 0.5555556 
4: 2L  C 10 1.0000000 

Oder wenn Ihr eine Lösung dyplr suchen, dann wie @ Brian vorgeschlagen:

df %>% group_by(product) %>% mutate(prop = sales/sum(sales)) 

Ausgang:

# A tibble: 4 x 4 
# Groups: product [3] 
    week product sales  prop 
    <int> <chr> <dbl>  <dbl> 
1  1  A 40 0.4444444 
2  1  B 20 1.0000000 
3  2  A 50 0.5555556 
4  2  C 10 1.0000000