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, ]
}
相关推荐
青莳吖2 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall9 分钟前
期末考学C
java·开发语言
重生之绝世牛码11 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行17 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157627 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明36 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
Monly2143 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu44 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202144 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
7yewh1 小时前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux