代码之家  ›  专栏  ›  技术社区  ›  joerna

缺少值的总和表

  •  3
  • joerna  · 技术社区  · 8 年前
    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缺失,因此无法反映表格。

    enter image description here

    我想要的cumsum表是这样的。2、6和7用之前的百分比填充。

    enter image description here

    1 回复  |  直到 8 年前
        1
  •  2
  •   akrun    8 年前

    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%
    

    这也可以通过数据实现。表列转换为后的方法 因素

    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%