R语言 数据整理篇之结构重塑

《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, ]
}
相关推荐
漫漫进阶路5 小时前
VS C++ 配置OPENCV环境
开发语言·c++·opencv
BinaryBardC6 小时前
Swift语言的网络编程
开发语言·后端·golang
code_shenbing6 小时前
基于 WPF 平台使用纯 C# 制作流体动画
开发语言·c#·wpf
邓熙榆6 小时前
Haskell语言的正则表达式
开发语言·后端·golang
ac-er88887 小时前
Yii框架中的队列:如何实现异步操作
android·开发语言·php
马船长7 小时前
青少年CTF练习平台 PHP的后门
开发语言·php
hefaxiang8 小时前
【C++】函数重载
开发语言·c++·算法
落幕9 小时前
C语言-构造数据类型
c语言·开发语言
勤又氪猿9 小时前
【问题】Qt c++ 界面 lineEdit、comboBox、tableWidget.... SIGSEGV错误
开发语言·c++·qt
Ciderw9 小时前
Go中的三种锁
开发语言·c++·后端·golang·互斥锁·