2017-11-09 3 views
2

Wie kann ich Cumsum Tabelle nach Geschlecht und Staat gruppiert bekommen?Cumsum Tabelle mit Gruppierung

Gender = sample(c('male', 'female'), 100, replace=TRUE) 
State = sample(c('CA', 'WA', 'NV', 'OR', "AZ"), 100, replace=TRUE) 
Number = sample(1:8, size=100, replace=TRUE) 

df <- data.frame(Gender,State, Number) 
+0

Versuchen 'Bibliothek (dplyr); df%>% group_by (Geschlecht, Bundesland)%>% mutieren (Anzahl = cumsum (Anzahl)) 'Nicht sicher über die Ausgabe obwohl – akrun

+0

Das ist ein schmutziger Tabellenname – vol7ron

+0

Was ist ein" Cumsum-Tabelle "? Wir alle erraten nur, was Sie für die Ausgabe wollen. – thelatemail

Antwort

1

Wenn wir für cumsum Tisch suchen, dann

library(data.table) 
dcast(setDT(df)[, .N, .(Gender, State, Number) 
     ][, perc := round(100*N/sum(N), 2), .(Gender, State)], 
    Gender + State ~Number, value.var = 'perc', fill = 0, drop = FALSE)[, 
    (3:10) := lapply(Reduce(`+`, .SD, accumulate = TRUE), 
      function(x) paste0(x, "%")), .SDcols = -(1:2)][] 
+1

Genau das habe ich gesucht! und wow..der Code ist kompliziert als ich dachte. Danke für deine Zeit und Mühe! – joerna

1

Für einen einfacheren Ansatz würde ich empfehlen, dplyr verwenden. Dplyr wird zusammen mit einer Reihe anderer hilfreicher Pakete geladen, wenn Sie ordentliches laden.

library(tidyverse) 

Gender = sample(c('male', 'female'), 100, replace=TRUE) 
State = sample(c('CA', 'WA', 'NV', 'OR', "AZ"), 100, replace=TRUE) 
Number = sample(1:8, size=100, replace=TRUE) 

df <- data.frame(Gender,State, Number) 

df <- df %>% 
    group_by(Gender, State) %>% 
    mutate(Number_CumSum = cumsum(Number)) %>% 
    ungroup() %>% 
    arrange(State, Gender) 

head(df) 

# A tibble: 6 x 4 
    Gender State Number Number_CumSum 
    <fctr> <fctr> <int>   <int> 
1 female  AZ  8    8 
2 female  AZ  3   11 
3 female  AZ  4   15 
4 female  AZ  5   20 
5 female  AZ  2   22 
6 female  AZ  7   29