北京大学生物信息平台论坛

 找回密码
 立即注册
搜索
热搜: 通知 活动

【R】如何从0-1数据得到列联表:table和xtabs函数的使用

[复制链接]
licheng 发表于 2016-1-16 14:00:16 | 显示全部楼层 |阅读模式
Chong Jin on October 19, 2013:
如何从0-1数据得到列联表:table和xtabs函数的使用

在处理0-1数据(binary data)中,我们经常需要将其转换为列联表(cross tabulation或称contingency table)。本次主角是table和xtabs函数。

生成测试数据
为了举例说明,我们首先生成0-1数据。set.seed(1)是为了设置种子,每次得到完全一样的“随机”数据。后面采用设置dim函数的方法建立matrix,可以避免使用matrix函数带来的拷贝一次mydata的额外操作。
  1. > mydata <- {set.seed(1); # set a constant seed so that
  2. >                         # we can get reproducible results
  3. >            <a href="http://sample.int/">sample.int</a>(2, size = 200, replace = T) - 1L} # generate binary ints
  4. > dim(mydata) <- c(100,2) # convert a vector to a matrix
复制代码
执行head函数,得到结果的是这样的。
  1. <pre>> head(mydata)
  2.      [,1] [,2]
  3. [1,]    0    1
  4. [2,]    0    0
  5. [3,]    1    0
  6. [4,]    1    1
  7. [5,]    0    1
  8. [6,]    1    0
  9. </pre>
复制代码

matrix类型

分别对mydata使用table函数和xtabs函数,试图建立连列表,结果如下。
  1. > table(mydata)
  2. mydata
  3.   0   1
  4. 98 102
  5. > xtabs(~ V1 + V2, data = mydata)
  6.    V2
  7. V1   0  1
  8.   0 23 29
  9.   1 23 25
复制代码
可见,使用table不能够对matrix类型建立连列表,而只是简单的对整个matrix中的0和1进行计数;table能够对data.frame类型建立连列表。

data.frame类型
首先利用前面的matrix类型的mydata建立data.frame类型的mydata.df。
  1. mydata.df <- as.data.frame(mydata)
复制代码
执行head函数,得到结果的是这样的。
  1. > head(mydata.df)
  2.   V1 V2
  3. 1  0  1
  4. 2  0  0
  5. 3  1  0
  6. 4  1  1
  7. 5  0  1
  8. 6  1  0
复制代码
这里和前面一样调用table和xtabs建立连列表。两个函数都能够得到我们想要的结果。
  1. > table(mydata.df)
  2.    V2
  3. V1   0  1
  4.   0 23 29
  5.   1 23 25
  6. > xtabs(~ V1 + V2, data = mydata.df)
  7.    V2
  8. V1   0  1
  9.   0 23 29
  10.   1 23 25
复制代码
总结如下:如果想要得到连列表的话,除了table和matrix类型的数据这种组合不行,其他三种组合都是可以的。

其他细节

  • 在已经建立好的连列表的基础上,使用ftable函数,可以在多变量的情况下,绘制出我们主要关注的变量处于列的位置,而其他变量处于行的位置的连列表。
    例如,对于结构如下的Titanic数据,
    1. > str(Titanic)
    2.   table [1:4, 1:2, 1:2, 1:2] 0 0 35 0 0 0 17 0 118 154 ...
    3.   - attr(*, "dimnames")=List of 4
    4.    ..$ Class   : chr [1:4] "1st" "2nd" "3rd" "Crew"
    5.    ..$ Sex     : chr [1:2] "Male" "Female"
    6.    ..$ Age     : chr [1:2] "Child" "Adult"
    7.    ..$ Survived: chr [1:2] "No" "Yes"
    复制代码
    我们举一个help文档中的范例:
    1. > ftable(Titanic, row.vars = 2:1, col.vars = "Survived")
    2.               Survived  No Yes
    3.      Sex    Class                 
    4.      Male   1st            118  62
    5.             2nd            154  25
    6.             3rd            422  88
    7.             Crew           670 192
    8.      Female 1st              4 141
    9.             2nd             13  93
    10.             3rd            106  90
    11.             Crew             3  20
    复制代码
  • as.data.frame可以看作是xtabs的逆函数,得到data.frame类型的表格。不过,最原始的0-1数据中,每一行的具体顺序的信息仍然丢失了,取而代之的,是新的记录频数的一列,称为Freq:
    1. > t <- xtabs(~ V1 + V2, data = mydata)
    2. > df <- as.data.frame(t)
    3. > df
    4.    V1 V2 Freq
    5. 1  0  0   23
    6. 2  1  0   23
    7. 3  0  1   29
    8. 4  1  1   25
    9. > xtabs(Freq~V1+V2, data = t)
    10.     V2
    11. V1   0  1
    12.    0 23 29
    13.    1 23 25
    复制代码
  • 制作连列表的时候需要注意,使用的两列数据的对应的行应当具有相同的行名,否则就会得到没有意义的结果。如果两列数据对应的行顺序不同,需要使用order函数先进行排序。

回复

使用道具 举报

北京大学生物信息平台论坛

GMT+8, 2017-9-20 04:46 , Processed in 0.038407 second(s), 23 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表