2017-11-09 8 views
2

성별과 국가별로 Cumsum 테이블을 그룹화하려면 어떻게해야합니까?그룹화 된 Cumsum 테이블

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

, cumsum 테이블을 찾고 있다면, DF %> % GROUP_BY (성별, 국가) %> % 돌연변이 (수 = cumsum (수))'출력에 대해서는 확실하지 않음 – akrun

+0

더러운 테이블 이름 – vol7ron

+0

"Cumsum 테이블"이란 무엇입니까? 우리는 모두 당신이 원하는 결과물을 추측합니다. – thelatemail

답변

1

우리가`라이브러리 (dplyr)를 시도하십시오

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

이것은 정확히 내가 찾고 있었던 것이다! 와우. 코드는 내가 생각했던 것보다 복잡하다. 시간과 노력에 감사드립니다! – joerna

1

더 간단한 방법으로 dplyr을 사용하는 것이 좋습니다. Dplyr은 tidyverse를로드 할 때 다른 유용한 패키지와 함께로드됩니다.

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