【问题标题】:How to create contigency tables (crosstabs) in R for a subset of columns with categorical data?如何在 R 中为具有分类数据的列子集创建列联表(交叉表)?
【发布时间】:2010-08-19 01:12:30
【问题描述】:

我有一个表头看起来像这样(我已经简化了):

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 的新手。

提前谢谢你。

【问题讨论】:

    标签: r crosstab


    【解决方案1】:

    为此目的,您的数据格式不正确。这是使用 reshape 包适当地重塑数据的一种方法。

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

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

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

    对于子集,取data.m 的相关子集。

    【讨论】:

      【解决方案2】:

      以下是使用基本 R 命令的方法。如果每一列都具有相同的因子水平,则不需要 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 2016-03-03
        • 2016-07-10
        • 1970-01-01
        • 2018-01-29
        • 1970-01-01
        相关资源
        最近更新 更多