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

如何在R中为包含分类数据的列子集创建连续表(交叉表)?

  •  2
  • wishihadabettername  · 技术社区  · 15 年前

    id, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10
    

    其中除id之外的每一行都是一个分类变量。让我们把类别命名为A,B,C,D,E。

    我想创建一个列联表 一些

          a1  a2  a3  a4 Total
        ----------------------
        A|
        B|
        C|
        D|
        E|
    Total|
    

    因此,问题是如何基于R中的多个列创建交叉表?我看到的table()和xtabs()示例只使用列。在我的例子中,列是相邻的,因此一个交叉表将汇总列a1..a4,另一个a5..a7,依此类推。我希望有一个优雅的方式来做到这一点。

    我是个程序员,但在R是个新手。

    2 回复  |  直到 15 年前
        1
  •  7
  •   JoFrhwld    15 年前

    为此,您的数据格式不正确。下面是一种使用 reshape

    library(reshape)
    data.m <- melt(data, id = "id")
    

    要计算所有级别的表(带边距),可以使用

    cast(data.m, value ~ variable, margins = T)
    

    data.m

        2
  •  3
  •   Joshua Ulrich    15 年前

    下面是如何使用baser命令来实现它。你不需要 for 如果每个列都有相同的因子级别,则循环,但该循环将是一个很好的故障保护。

    > set.seed(21)
    > df <- data.frame(
    +   id=1:20,
    +   a1=sample(letters[1:4],20,TRUE),
    +   a2=sample(letters[1:5],20,TRUE),
    +   a3=sample(letters[2:5],20,TRUE),
    +   a4=sample(letters[1:5],20,TRUE),
    +   a5=sample(letters[1:5],20,TRUE),
    +   a6=sample(letters[1:5],20,TRUE) )
    > 
    > for(i in 2:NCOL(df)) {
    +   levels(df[,i]) <- list(a="a",b="b",c="c",d="d",e="e")
    + }
    > 
    > addmargins(mapply(table,df[,-1]))
        a1 a2 a3 a4 a5 a6 Sum
    a    6  2  0  2  5  3  18
    b    3  3  7  2  1  3  19
    c    5  3  1  6  5  3  23
    d    6  8  6  1  5  3  29
    e    0  4  6  9  4  8  31
    Sum 20 20 20 20 20 20 120