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

Xtabs中的利润总额

r
  •  4
  • James  · 技术社区  · 14 年前

    如果有两个交叉分类变量,可以使用 rowSums colSums xtabs 输出。但是,如果你有3个分类变量(即每个子表中的利润总额),怎么做呢?

    5 回复  |  直到 8 年前
        1
  •  7
  •   dsz    8 年前

    阿尼科在一篇评论中提到了这一点,但从未提供过答案。

    我独立地发现了这个,然后在评论中注意到它就在这里,所以感谢阿尼科先得到它。

    addmargins 答案是:

    对于给定的表,可以指定要 按一个或多个级别展开以保留要计算的页边距。一可能 例如,在第一维度和中间值上形成和和和平均值。 在第二个。结果表将有两个额外的级别 对于第一个维度,另一个级别用于第二个维度。这个 默认值是表中所有页边距的总和。其他可能性 可能给出的结果取决于利润率的顺序 计算。这在函数的打印输出中被标记。

        2
  •  4
  •   Aniko    14 年前

    一般的方法是使用 apply 函数,但具体用于总计 margin.table 功能可能更方便:

    #create 3 factors
    a <- gl(2,4, length=20)
    b <- gl(3,2, length=20)
    d <- gl(4,2, length=20)
    # table
    tt <- xtabs(~a+b+d)
    
    # marginal sums
    margin.table(tt, 1)
    apply(tt, 1, sum)  #same answer
    
    #multi-way margins
    margin.table(tt, 1:2)
    apply(tt, 1:2, sum)  #same answer
    
        3
  •  4
  •   Ian Fellows    14 年前

    如果您没有绑定到Xtabs,那么演绎器包对于应急表有一些很好的功能:

    > a <- gl(2,4, length=20)
    > b <- gl(3,2, length=20)
    > d <- rnorm(20)>0
    > dat <- data.frame(a,b,d)
    > tables<-contingency.tables(
    + row.vars=a,
    + col.vars=b,
    + stratum.var=d,data=dat)
    > tables
    ================================================================================
    
                   ==================================================               
                          ========== Table: a by b ==========                      
    
                           | -- Stratum = FALSE --
                           | b 
                         a |        1  |        2  |        3  | Row Total | 
    -----------------------|-----------|-----------|-----------|-----------|
               1  Count    |        2  |        2  |        1  |        5  | 
                  Row %    |   40.000% |   40.000% |   20.000% |   55.556% | 
                  Column % |   40.000% |  100.000% |   50.000% |           | 
                  Total %  |   22.222% |   22.222% |   11.111% |           | 
    -----------------------|-----------|-----------|-----------|-----------|
               2  Count    |        3  |        0  |        1  |        4  | 
                  Row %    |   75.000% |    0.000% |   25.000% |   44.444% | 
                  Column % |   60.000% |    0.000% |   50.000% |           | 
                  Total %  |   33.333% |    0.000% |   11.111% |           | 
    -----------------------|-----------|-----------|-----------|-----------|
              Column Total |        5  |        2  |        2  |        9  | 
                  Column % |   55.556% |   22.222% |   22.222% |           | 
    
                           | -- Stratum = TRUE --
                           | b 
                         a |        1  |        2  |        3  | Row Total | 
    -----------------------|-----------|-----------|-----------|-----------|
               1  Count    |        2  |        2  |        3  |        7  | 
                  Row %    |   28.571% |   28.571% |   42.857% |   63.636% | 
                  Column % |   66.667% |   50.000% |   75.000% |           | 
                  Total %  |   18.182% |   18.182% |   27.273% |           | 
    -----------------------|-----------|-----------|-----------|-----------|
               2  Count    |        1  |        2  |        1  |        4  | 
                  Row %    |   25.000% |   50.000% |   25.000% |   36.364% | 
                  Column % |   33.333% |   50.000% |   25.000% |           | 
                  Total %  |    9.091% |   18.182% |    9.091% |           | 
    -----------------------|-----------|-----------|-----------|-----------|
              Column Total |        3  |        4  |        4  |       11  | 
                  Column % |   27.273% |   36.364% |   36.364% |           | 
    
    
    ================================================================================
    
        4
  •  2
  •   momobo    14 年前

    (如果我理解正确)您可以使用ddply:

    ff <- data.frame(f1=c("a", "b", "b", "b", "b", "b", "b"), f2=c("p", "p", "p", "q", "q", "q", "q"), f3=c("x","x","x","x","y", "y", "y"), val=c(1:7)) 
    
    ddply(ff, .(f1), numcolwise(sum))
    ddply(ff, .(f2), numcolwise(sum))
    ddply(ff, .(f3), numcolwise(sum))
    
        5
  •  0
  •   James    14 年前

    上面的注释不起作用。谢谢你的回答,但他们没有按我的期望做-每个小组的个人总数。

    在仔细研究之后,我发现在这种情况下,Xtabs输出是一个三维数组,并编写了以下函数以获得我想要的结果(注意它不完整,但目前对列总数有效):

    xtabTotals <- function(tabs,margin=1)
    # takes a 3 dimensional xtabs array and performs margin total on each sub table
    # only doing column margins so far
    {
        out <- array(0,dim(tabs)+c(1,0,0))
        dnout <- dimnames(tabs)
        dnout[[1]] <- c(dnout[[1]],"Total")
        dimnames(out) <- dnout
    
        for (i in 1:dim(tabs)[3])
        {
            out[,,i] <- rbind(tabs[,,i],colSums(tabs[,,i]))
        }
        out
    }