2

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

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 中是新手。

先感谢您。

4

2 回答 2

7

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

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

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

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

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

于 2010-08-19T01:19:21.033 回答
3

以下是使用基本 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
于 2010-08-19T16:24:23.093 回答