2017-10-31 2 views
3
dt <- data.table(Name =c("A","A","A","A","B","B","B","B","B"), 
      Number = c(1,3,3,4, 4, 1,1,5,8)) 

이 방법으로 cumsum 테이블을 만들었습니다.누락 값이있는 Cumsum 테이블

library(matrixStats) 
tbl <- round(prop.table(table(dt), 1) * 100, 3) 
tbl[] <- rowCumsums(tbl) 
names(dimnames(tbl)) <- NULL 
tbl[] <- paste0(sub("^([^.]+)(\\.[^0]).*", "\\1\\2", tbl), "%") 
cumsumtable <- as.data.frame.matrix(tbl) 

원래 dt에서 2,6,7이 누락되어 테이블을 반영하지 않았습니다.

enter image description here

내 원하는 cumsum 테이블은 다음과 같이한다. 2,6 및 7은 이전 비율로 채워집니다.

enter image description here

답변

2

이도 수행 할 수 있습니다

cumsumtable 
# 1 2 3 4 5 6 7 8 
#A 25% 25% 75% 100% 100% 100% 100% 100% 
#B 40% 40% 40% 60% 80% 80% 80% 100% 

영업의 코드를 실행 한 후

dt[, Number := factor(Number, levels = min(Number):max(Number))] 

및 지정된 우리는 levelsfactor 컬럼에 '수'를 변환 할 수 있습니다 열 변환 후 data.table 메소드를 통해 factor

dcast(dt[, .N,.(Name, Number)][, perc := 100*N/sum(N), Name], 
    Name ~ Number, value.var = 'perc', fill = 0, drop = FALSE)[, 
     (2:9) := lapply(Reduce(`+`, .SD, accumulate = TRUE), 
       function(x) paste0(x, "%")), .SDcols = -1][] 
# Name 1 2 3 4 5 6 7 8 
#1: A 25% 25% 75% 100% 100% 100% 100% 100% 
#2: B 40% 40% 40% 60% 80% 80% 80% 100% 
관련 문제