《Cookbook for R》Manipulating Data ~ Restructuring 数据整理篇之数据结构重塑
Converting between data frames and contingency tables 在数据框和列联表之间转换
表示同样的内容但是三种不同的表现形式:
1、呈现个案观测值的数据框 cases
:每行代表一个案例的数据框
2、每种类型个案计数的数据框 counts
:每行表示每种组合的计数
3、列联表(contingency table)ctable
列联表,用于表示两个或者多个分类变量之间关系的表格
{r}
# 每行是一个个体独立的测量值
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
# sex 和 color 的每种组合结果进行计数
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
如果要将 cases
转为 ctable
格式
{r}
ctable <- table(cases)
ctable
#> Color
#> Sex blue brown
#> F 0 3
#> M 1 1
# 如果用两个向量调用表格,那么这两个维度的 (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
table(cases[,c("Sex","Color")])
#> Color
#> Sex blue brown
#> F 0 3
#> M 1 1
如果要将 cases
转为 counts
格式
{r}
# 计数sex和color每种组合的频数
# 储存在 countdf 中
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
如果要将 ctable
转为 cases
格式
{r}
countsToCases(as.data.frame(ctable))
#> Sex Color
#> 2 M blue
#> 3 F brown
#> 3.1 F brown
#> 3.2 F brown
#> 4 M brown
如果要将 ctable
转为 counts
格式
{r}
as.data.frame(ctable)
#> Sex Color Freq
#> 1 F blue 0
#> 2 M blue 1
#> 3 F brown 3
#> 4 M brown 1
如果要将 counts
转为 cases
格式
{r}
countsToCases(countdf)
#> Sex Color
#> 2 M blue
#> 3 F brown
#> 3.1 F brown
#> 3.2 F brown
#> 4 M brown
如果要将 counts
转为 ctable
格式
{r}
xtabs(Freq ~ Sex+Color, data=countdf)
#> Color
#> Sex blue brown
#> F 0 3
#> M 1 1
扩展:countsToCases()
函数
{r}
# 从 counts 转为 cases
# `countcol` 是包含 counts 的列名
countsToCases <- function(x, countcol = "Freq") {
# 从 x 中获取行索引
idx <- rep.int(seq_len(nrow(x)), x[[countcol]])
# 去掉计数列
x[[countcol]] <- NULL
# 从 x 中获取行数
x[idx, ]
}