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, ]
}
相关推荐
hboot2 天前
AI工程师第二课 - 数据处理
人工智能·python·数据分析
LDR0063 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园3 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob3 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享3 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.3 天前
C语言--day30
c语言·开发语言
何以解忧,唯有..3 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
謓泽3 天前
C语言不是语法,是通往机器的地图。
c语言·开发语言
云水一下3 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php