R语言 数据框的长、宽格式转换

Converting data between wide and long format 在宽、长格式之间转换数据

R语言中的大多数函数希望数据是长格式
但是,像 SPSS 通常使用宽格式数据
当你想把将数据从宽转换为长格式

常用的有两种方法:
1、gather()spread() 来自 tidyr 包。
2、melt() 以及 dcast() 来自 reshape2

还有许多不常用的函数也可以实现:
1、reshape() 函数,不过它不是 reshape2 包的一部分,是 R base
2、stack()unstack()

示例数据

olddata_wide <- read.table(header=TRUE, text='subject sex control cond1 cond21   M     7.9  12.3  10.72   F     6.3  10.6  11.13   F     9.5  13.1  13.84   M    11.5  13.4  12.9
')
# 确保 subject 这一列是因子
olddata_wide$subject <- factor(olddata_wide$subject)olddata_long <- read.table(header=TRUE, text='subject sex condition measurement1   M   control         7.91   M     cond1        12.31   M     cond2        10.72   F   control         6.32   F     cond1        10.62   F     cond2        11.13   F   control         9.53   F     cond1        13.13   F     cond2        13.84   M   control        11.54   M     cond1        13.44   M     cond2        12.9
')
# 确保 subject 这一列是因子
olddata_long$subject <- factor(olddata_long$subject)

使用tidyr

1、从宽到长:
使用tidyr的函数gather()

olddata_wide
#>   subject sex control cond1 cond2
#> 1       1   M     7.9  12.3  10.7
#> 2       2   F     6.3  10.6  11.1
#> 3       3   F     9.5  13.1  13.8
#> 4       4   M    11.5  13.4  12.9library(tidyr)# 用法
gather(data,key = "key",value = "value",...,na.rm = FALSE,convert = FALSE,factor_key = FALSE
)# 函数gather()的参数:
# - data: 目标数据集
# - key: 新的列的名称(可以有多个)
# - value: 选择用来填充key列的列
# - ...: value可以有多个
# - factor_key: 将新的列转为因子 (FALSE为向量)
# - na.rm: 删除缺失的值. 默认为FALSE
data_long <- gather(olddata_wide, condition, measurement, control:cond2, factor_key=TRUE)
## condition、measurement 是新增的列
## 这两列的数据是来自原数据框 control:cond2 这三列data_long
#>    subject sex condition measurement
#> 1        1   M   control         7.9
#> 2        2   F   control         6.3
#> 3        3   F   control         9.5
#> 4        4   M   control        11.5
#> 5        1   M     cond1        12.3
#> 6        2   F     cond1        10.6
#> 7        3   F     cond1        13.1
#> 8        4   M     cond1        13.4
#> 9        1   M     cond2        10.7
#> 10       2   F     cond2        11.1
#> 11       3   F     cond2        13.8
#> 12       4   M     cond2        12.9

也可以靠列出每个列来

gather(olddata_wide, condition, measurement, control, cond1, cond2)

如果要以编程的形式来使用函数 gather() , 需要把列名包含进变量中

keycol <- "condition"
valuecol <- "measurement"
gathercols <- c("control", "cond1", "cond2")gather_(olddata_wide, keycol, valuecol, gathercols)

扩展:重命名变量列的因子 level ,然后进行排序

# 重命名因子名字 "cond1" 、 "cond2" 到 "first" 、 "second"
levels(data_long$condition)[levels(data_long$condition)=="cond1"] <- "first"
levels(data_long$condition)[levels(data_long$condition)=="cond2"] <- "second"# 先按 subject 排序, 再按 condition 排序
data_long <- data_long[order(data_long$subject, data_long$condition), ]
data_long
#>    subject sex condition measurement
#> 1        1   M   control         7.9
#> 5        1   M     first        12.3
#> 9        1   M    second        10.7
#> 2        2   F   control         6.3
#> 6        2   F     first        10.6
#> 10       2   F    second        11.1
#> 3        3   F   control         9.5
#> 7        3   F     first        13.1
#> 11       3   F    second        13.8
#> 4        4   M   control        11.5
#> 8        4   M     first        13.4
#> 12       4   M    second        12.9

2、从长到宽

使用函数 spread()

olddata_long
#>    subject sex condition measurement
#> 1        1   M   control         7.9
#> 2        1   M     cond1        12.3
#> 3        1   M     cond2        10.7
#> 4        2   F   control         6.3
#> 5        2   F     cond1        10.6
#> 6        2   F     cond2        11.1
#> 7        3   F   control         9.5
#> 8        3   F     cond1        13.1
#> 9        3   F     cond2        13.8
#> 10       4   M   control        11.5
#> 11       4   M     cond1        13.4
#> 12       4   M     cond2        12.9library(tidyr)# The arguments to spread():
# - data: 数据集
# - key: 需要变成横向的列
# - value: 用于填充key列的数据来源
data_wide <- spread(olddata_long, condition, measurement)
## 将 condition 的几类拆成另外几列data_wide
#>   subject sex cond1 cond2 control
#> 1       1   M  12.3  10.7     7.9
#> 2       2   F  10.6  11.1     6.3
#> 3       3   F  13.1  13.8     9.5
#> 4       4   M  13.4  12.9    11.5

可以理解为 spread()gather()是完全相反的

扩展:美化数据外观的举措

# R重命名cond1、cond2
names(data_wide)[names(data_wide)=="cond1"] <- "first"
names(data_wide)[names(data_wide)=="cond2"] <- "second"# 重新排序列
data_wide <- data_wide[, c(1,2,5,3,4)]
data_wide
#>   subject sex control first second
#> 1       1   M     7.9  12.3   10.7
#> 2       2   F     6.3  10.6   11.1
#> 3       3   F     9.5  13.1   13.8
#> 4       4   M    11.5  13.4   12.9

因子水平的顺序决定了列的顺序。
可以在重塑之前更改级别顺序,也可以在之后对列进行重新排序。


使用reshape2

1、从宽到长

melt()函数

olddata_wide
#>   subject sex control cond1 cond2
#> 1       1   M     7.9  12.3  10.7
#> 2       2   F     6.3  10.6  11.1
#> 3       3   F     9.5  13.1  13.8
#> 4       4   M    11.5  13.4  12.9library(reshape2)# melt参数解释
melt(data, # 需要操作的数据id.vars, # 不想改变的数据列measure.vars, # 你要melt的数据variable.name= 'variable', # melt操作后,为新列变量取名na.rm=FALSE, # 是否去除NAvalue.name='value', # 新列对应值的变量名factorsAsStrings=TRUE)melt(olddata_wide, id.vars=c("subject", "sex"))
#>    subject sex variable value
#> 1        1   M  control   7.9
#> 2        2   F  control   6.3
#> 3        3   F  control   9.5
#> 4        4   M  control  11.5
#> 5        1   M    cond1  12.3
#> 6        2   F    cond1  10.6
#> 7        3   F    cond1  13.1
#> 8        4   M    cond1  13.4
#> 9        1   M    cond2  10.7
#> 10       2   F    cond2  11.1
#> 11       3   F    cond2  13.8
#> 12       4   M    cond2  12.9# 更多输出参数设置
data_long <- melt(olddata_wide,id.vars=c("subject", "sex"),measure.vars=c("control", "cond1", "cond2" ),variable.name="condition",value.name="measurement"
)
data_long
#>    subject sex condition measurement
#> 1        1   M   control         7.9
#> 2        2   F   control         6.3
#> 3        3   F   control         9.5
#> 4        4   M   control        11.5
#> 5        1   M     cond1        12.3
#> 6        2   F     cond1        10.6
#> 7        3   F     cond1        13.1
#> 8        4   M     cond1        13.4
#> 9        1   M     cond2        10.7
#> 10       2   F     cond2        11.1
#> 11       3   F     cond2        13.8
#> 12       4   M     cond2        12.9

如果省略 measure.varsmelt() 将自动使用所有其他变量作为 id.vars ;
如果省略 id.vars ,情况正好相反。

如果不指定 variable.name ,它将命名该列 “variable” ;
如果省略 value.name ,它将命名该列 “measurement” 。

扩展:重命名变量列的因子 level ,然后进行排序 (步骤同上)

2、从长到宽

cast() 函数分为:dcast()acast()
dcast() 重构数据框;如果是列表或者是矩阵,改用 acast()

# dcast参数解释:
dcast(data, formula, fun.aggregate)
# - data : 所选的数据;
# - formula:描述了想要的最后结果; 其接受的公式形如:rowvar1 + rowvar2 + ... ~ colvar1 + colvar2 + ...;
## 在这一公式中,rowvar1 + rowvar2 + ...定义了要划掉的变量集合,以确定各行的内容,而colvar1 + colvar2 + 
## ...则定义了要划掉的、确定各列内容的变量集合。
# - fun.aggregate是(可选的)数据整合函数,比如求均值等等。olddata_long
#>    subject sex condition measurement
#> 1        1   M   control         7.9
#> 2        1   M     cond1        12.3
#> 3        1   M     cond2        10.7
#> 4        2   F   control         6.3
#> 5        2   F     cond1        10.6
#> 6        2   F     cond2        11.1
#> 7        3   F   control         9.5
#> 8        3   F     cond1        13.1
#> 9        3   F     cond2        13.8
#> 10       4   M   control        11.5
#> 11       4   M     cond1        13.4
#> 12       4   M     cond2        12.9# 保留 "subject" 和 "sex" 两列
# 拆分 condition 列为 control、cond1、cond2三个变量
# 拆分后的变量测量值用 measurement 来填充library(reshape2)data_wide <- dcast(olddata_long, subject + sex ~ condition, value.var="measurement")
data_wide
#>   subject sex cond1 cond2 control
#> 1       1   M  12.3  10.7     7.9
#> 2       2   F  10.6  11.1     6.3
#> 3       3   F  13.1  13.8     9.5
#> 4       4   M  13.4  12.9    11.5

扩展:美化数据外观的举措 (同上)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

W801学习笔记十二:掌机进阶V3版本之驱动(PSRAM/SD卡)

本次升级添加了两个模块&#xff0c;现在要把他们驱动起来。 一&#xff1a;PSRAM 使用SDK自带的驱动&#xff0c;我们只需要写一个初始化函数&#xff0c;并在其中添加一些自检代码。 void psram_heap_init(){wm_psram_config(0);//实际使用的psram管脚选择0或者1&#xff…

美团:搜索推荐算法工程师

目录 机器学习、深度学习和强化学习 迁移学习: 强化学习: 可解释性推荐:

中小学生如何开始创办谷歌?

现在财富自由这个词很火&#xff0c;因为每个人都想让自己能够摆脱朝九晚五工作的束缚。而通往财富自由的最佳路径——那就是创办自己的公司。 这不仅仅是关于金钱&#xff0c;更是关于掌控自己的未来&#xff0c;实现个人价值的最大化。 你是否曾梦想过自己的创意能够颠覆整…

Java学习路线及自我规划

荒废了一段时间&#xff0c;这段时间的总结开始了JavaWeb的学习但是困难重重&#xff0c;例如Maven&#xff0c;Vue的路由等&#xff0c;所以我反省了一段时间&#xff0c;因为基础薄弱&#xff0c;加之学习的资源是速成视频&#xff0c;导致大厦将倾的局面&#xff08;也算不上…

RabbitMQ工作模式(5) - 主题模式

概念 主题模式&#xff08;Topic Exchange&#xff09;是 RabbitMQ 中一种灵活且强大的消息传递模式&#xff0c;它允许生产者根据消息的特定属性将消息发送到一个交换机&#xff0c;并且消费者可以根据自己的需求来接收感兴趣的消息。主题交换机根据消息的路由键和绑定队列的路…

RabbitMQ的理论知识点,和使用RabbitMQ时常见的问题点【理论】!

不管使用任何语言调用RabbitMQ 一般都会存在各种问题&#xff0c;我整理了一下 我觉得会遇到的常见问题&#xff0c;并记录了 解决思路 。没有提供具体代码&#xff0c;后续有时间写个代码体会一下&#xff0c;实际有了解决思路&#xff0c;百度里有很多代码让我们使用。哈哈 …

盲人地图使用的革新体验:助力视障人士独立、安全出行

在我们日常生活中&#xff0c;地图导航已经成为不可或缺的出行工具。而对于盲人群体来说&#xff0c;盲人地图使用这一课题的重要性不言而喻&#xff0c;它不仅关乎他们的出行便利性&#xff0c;更是他们追求生活独立与品质的重要一环。 近年来&#xff0c;一款名为蝙蝠…

代码随想录算法训练营第三十八天| 动态规划,509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯

目录 动态规划 题目链接&#xff1a; 509. 斐波那契数 思路 代码 题目链接&#xff1a; 70. 爬楼梯 思路 代码 题目链接&#xff1a; 746. 使用最小花费爬楼梯 思路 代码 总结 动态规划 Dynamic programming&#xff0c;DP问题。某一问题包含很多重叠的子问题&#x…

echarts地图叠加百度地图底板实现数据可视化

这里写自定义目录标题 echarts地图叠加百度地图实现数据可视化echarts地图叠加百度地图实现数据可视化 实现数据可视化时,个别情况下需要在地图上实现数据的可视化,echarts加载geojson数据可以实现以地图形式展示数据,例如分层设色或者鼠标hover展示指标值,但如果要将echa…

React 之 组件模块依赖

导入&#xff08;Import&#xff09;和导出&#xff08;exporing&#xff09;组件 在一个文件中声明多个组件&#xff0c;但是文件变得太大的话就不方便查看了。要解决此问题&#xff0c;你可以将一个组件放到一个单独的文件中并&#xff08;导出&#xff09; export 组件&…

运筹系列91:vrp算法包PyVRP

1. 介绍 PyVRP使用HGS&#xff08;hybrid genetic search&#xff09;算法求解VRP类问题。在benchmark上的评测结果如下&#xff0c;看起来还不错&#xff1a; 2. 使用例子 2.1 CVRP COORDS [(456, 320), # location 0 - the depot(228, 0), # location 1(912, 0), …

C++进阶之路——关键字

C进阶——关键字 本系列博客主要对于已经有一定C/C基础的网友&#xff0c;欢迎志同道合的朋友来进行纯粹的技术交流&#xff01;&#xff01;&#xff01; 一、const 在C中&#xff0c;const 关键字是一个非常重要的特性&#xff0c;用于定义变量或对象的值为常量&#xff0c;…

通往AGI路上,DPU将如何构建生成式AI时代的坚实算力基石?

4月19日&#xff0c;在以“重构世界 奔赴未来”为主题的2024中国生成式AI大会上&#xff0c;中科驭数作为DPU新型算力基础设施代表&#xff0c;受邀出席了中国智算中心创新论坛&#xff0c;发表了题为《以网络为中心的AI算力底座构建之路》主题演讲&#xff0c;勾勒出在通往AGI…

Xcode 15构建问题

构建时出现的异常&#xff1a; 解决方式&#xff1a; 将ENABLE_USER_SCRIPT_SANDBOXING设为“no”即可&#xff01;

GateWay具体的使用!!!

一、全局Token过滤器 在Spring Cloud Gateway中&#xff0c;实现全局过滤器的目的是对所有进入系统的请求或响应进行统一处理&#xff0c;比如添加日志、鉴权等。下面是如何创建一个全局过滤器的基本步骤&#xff1a; 步骤1: 创建过滤器类 首先&#xff0c;你需要创建一个实现…

表---商场 nine

CREATE TABLE gao25 (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,shopId int(11) NOT NULL COMMENT 店铺ID,goodsId int(11) NOT NULL COMMENT 商品ID,attrId int(11) NOT NULL COMMENT 属性名称,attrVal text NOT NULL COMMENT 属性值,createTime datetime NOT NULL …

实验 1--SQL Server2008数据库开发环境

文章目录 实验 1--SQL Server2008数据库开发环境2.4.1 实验目的2.4.2 实验准备2.4.3 实验内容1.利用 SSMS 访问系统自带的Report Server 数据库。2.熟悉了解 SMSS对象资源管理器树形菜单相关选择项的功能。(1)右键单击数据库Report Server&#xff0c;查看并使用相关功能;(2)选…

scp用法

scp常用参数&#xff1a; 命令选项 含义 -1 使用ssh协议版本1 -2 使用ssh协议版本2 -4 使用ipv4 6 使用ipv6 -B 以批处理模式运行 -C 使用压缩 -F 指定ssh配置文件 -l 指定带宽限制 -o 指定使用的ssh选项 -P 指定远程主机的端口号 -p 保留…

[C++基础学习]----02-C++运算符详解

前言 C中的运算符用于执行各种数学或逻辑运算。下面是一些常见的C运算符及其详细说明&#xff1a;下面详细解释一些常见的C运算符类型&#xff0c;包括其原理和使用方法。 正文 01-运算符简介 算术运算符&#xff1a; a、加法运算符&#xff08;&#xff09;&#xff1a;对两个…

基于openwrt交叉编译opencv4.9.0版本

源码包的获取 源码获取有两种方式&#xff0c;一种是通过编译时在makefile指定它的git地址&#xff0c;在编译时下载&#xff0c;这种很依赖网速&#xff0c;网速不好时&#xff0c;编译会失败。另一种是我们将源码的压缩包下载到本地&#xff0c;放到我们的SDK中&#xff0c;…