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 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo1232 天前
matlab画图工具
开发语言·matlab
dustcell.2 天前
haproxy七层代理
java·开发语言·前端
norlan_jame2 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone2 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ4022054962 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月2 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_531237172 天前
C语言-数组练习进阶
c语言·开发语言·算法
Sylvia33.2 天前
火星数据:解构斯诺克每一杆进攻背后的数字语言
java·前端·python·数据挖掘·数据分析
Railshiqian2 天前
给android源码下的模拟器添加两个后排屏的修改
android·开发语言·javascript