Таблица cumsum с отсутствующим значением

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))

Таким образом я создал сводную таблицу.

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, поэтому это не отражало таблицу.

введите здесь описание изображения

Моя желаемая таблица cumsum выглядит так. 2,6 и 7 заполнены процентами ранее.

введите здесь описание изображения


person joerna    schedule 31.10.2017    source источник


Ответы (1)


Мы можем преобразовать «Число» в столбец factor с указанным levels

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

а затем запустить код OP

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%

Это также можно сделать с помощью методов 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%
person akrun    schedule 31.10.2017