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