6.19 数据框与列联表互换

6.19 数据框与列联表互换

6.19.1 问题

你想要在多种情况的一个数据框、每种情况类型计数的数据框以及一个列联表之间转换。

6.19.2 方案

这里有 3 种数据结构代表相同的信息,但是形式不同:

  • cases: 每一行代表一个情况的数据框
  • ctable: 一个列联表
  • counts: 计数的数据框,每行代表每一种组合的数目
## 每一行代表一种情况
cases <- data.frame(Sex = c("M", "M", "F", "F", "F"), Color = c("brown",
  "blue", "brown", "brown", "brown"))
cases
#>   Sex Color
#> 1   M brown
#> 2   M  blue
#> 3   F brown
#> 4   F brown
#> 5   F brown

## 一个列联表
ctable <- table(cases)
ctable
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1

## 一个每种组合计数的表格
counts <- data.frame(Sex = c("F", "M", "F", "M"), Color = c("blue",
  "blue", "brown", "brown"), Freq = c(0, 1, 3, 1))
counts
#>   Sex Color Freq
#> 1   F  blue    0
#> 2   M  blue    1
#> 3   F brown    3
#> 4   M brown    1

6.19.2.1 将情况记录转为列联表

将情况记录转为列联表(上面已经展示了):

ctable <- table(cases)
ctable
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1

## 如果你使用两个向量调用table函数,它将不会给维度添加名字(Sex和Color)
table(cases$Sex, cases$Color)
#>
#>     blue brown
#>   F    0     3
#>   M    1     1

## 维度名可以通过`dnn`选项手动指定
table(cases$Sex, cases$Color, dnn = c("Sex", "Color"))
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1

6.19.2.2 将情况记录转为计数

它可以用一个数据框代表每一种组合的计数。注意它被转换并存储在 countdf 对象中:

## Cases to Counts
countdf <- as.data.frame(table(cases))
countdf
#>   Sex Color Freq
#> 1   F  blue    0
#> 2   M  blue    1
#> 3   F brown    3
#> 4   M brown    1

6.19.2.3 countsToCases() 函数

这个函数使用在上面的例子中:

## Convert from data frame of counts to data frame of
## cases.  `countcol` is the name of the column
## containing the counts
countsToCases <- function(x, countcol = "Freq") {
  # Get the row indices to pull from x
  idx <- rep.int(seq_len(nrow(x)), x[[countcol]])

  # Drop count column
  x[[countcol]] <- NULL

  # Get the rows from x
  x[idx, ]
}

6.19.2.4 列联表转为情况记录

countsToCases(as.data.frame(ctable))
#>     Sex Color
#> 2     M  blue
#> 3     F brown
#> 3.1   F brown
#> 3.2   F brown
#> 4     M brown

注意,countsToCases() 函数定义在上面。

6.19.2.5 列联表转为计数

as.data.frame(ctable)
#>   Sex Color Freq
#> 1   F  blue    0
#> 2   M  blue    1
#> 3   F brown    3
#> 4   M brown    1

从这里我们可以看到上一个代码的中间效果

6.19.2.6 计数转为情况记录

countsToCases(countdf)
#>     Sex Color
#> 2     M  blue
#> 3     F brown
#> 3.1   F brown
#> 3.2   F brown
#> 4     M brown

这相当于是列联表转为情况记录的第二步。

6.19.2.7 计数转为列联表

xtabs(Freq ~ Sex + Color, data = countdf)
#>    Color
#> Sex blue brown
#>   F    0     3
#>   M    1     1