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, ]
}
相关推荐
励志要当大牛的小白菜1 小时前
ART配对软件使用
开发语言·c++·qt·算法
Chef_Chen2 小时前
从0开始学习R语言--Day55--弹性网络
r语言
爱装代码的小瓶子4 小时前
数据结构之队列(C语言)
c语言·开发语言·数据结构
charlee444 小时前
PandasAI连接LLM进行智能数据分析
ai·数据分析·llm·pandasai·deepseek
Maybe_ch5 小时前
.NET-键控服务依赖注入
开发语言·c#·.net
超浪的晨5 小时前
Java UDP 通信详解:从基础到实战,彻底掌握无连接网络编程
java·开发语言·后端·学习·个人开发
终焉暴龙王5 小时前
CTFHub web进阶 php Bypass disable_function通关攻略
开发语言·安全·web安全·php
Edingbrugh.南空6 小时前
Aerospike与Redis深度对比:从架构到性能的全方位解析
java·开发语言·spring
Blossom.1186 小时前
基于深度学习的图像分类:使用Capsule Networks实现高效分类
人工智能·python·深度学习·神经网络·机器学习·分类·数据挖掘
CodeCraft Studio7 小时前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html