R语言 tidyr包的三个重要函数:gather,spread,separate的用法和举例

tidyr是Hadley(Tidy Data的作者Hadley Wickham)写的非常有用、并且经常会使用到的包,常与dplyr包结合使用(这个包也是他写的)

准备工作:

首先安装tidyr包(一定要加引号,不然报错)

install.packages("tidyr")

载入tidyr(可以不加引号)

library(tidyr)

gather()

gather函数类似于Excel(2016起)中的数据透视的功能,能把一个变量名含有变量的二维表转换成一个规范的二维表(类似数据库中关系的那种表,具体看例子)

我们先  >?gather,看看官方文档说明:

gather {tidyr}    R Documentation
Gather columns into key-value pairs.

Description

Gather takes multiple columns and collapses into key-value pairs, duplicating all other columns as needed. You use gather() when you notice that you have columns that are not variables.

Usage

gather(data, key = "key", value = "value", ..., na.rm = FALSE,
  convert = FALSE, factor_key = FALSE)
Arguments

data    
A data frame.
key, value    
Names of new key and value columns, as strings or symbols.
This argument is passed by expression and supports quasiquotation (you can unquote strings and symbols). The name is captured from the expression with rlang::ensym() (note that this kind of interface where symbols do not represent actual objects is now discouraged in the tidyverse; we support it here for backward compatibility).
...    (这是一个参数)
A selection of columns. If empty, all variables are selected. You can supply bare variable names, select all variables between x and z with x:z, exclude y with -y. For more options, see the dplyr::select() documentation. See also the section on selection rules below.
na.rm    
If TRUE, will remove rows from output where the value column in NA.
convert    
If TRUE will automatically run type.convert() on the key column. This is useful if the column types are actually numeric, integer, or logical.
factor_key    
If FALSE, the default, the key values will be stored as a character vector. If TRUE, will be stored as a factor, which preserves the original ordering of the columns.

说明:

第一个参数放的是原数据,数据类型要是一个数据框;

下面传一个键值对,名字是自己起的,这两个值是做新转换成的二维表的表头,即两个变量名;

第四个是选中要转置的列,这个参数不写的话就默认全部转置;

后面还可以加可选参数na.rm,如果na.rm = TRUE,那么将会在新表中去除原表中的缺失值(NA)。

gather()举例

先构造一个数据框stu:

stu<-data.frame(grade=c("A","B","C","D","E"), female=c(5, 4, 1, 2, 3), male=c(1, 2, 3, 4, 5))

这个数据框什么意思就不说了,就是你想的那样,成绩-性别的人数分布。

变量中的female和male就是上面所说的变量名中含有了变量,female和male应该是“性别”这个变量的的变量值,下面的人数的变量名(或者说属性名)应该是“人数”,下面我们需要把原grade一列保留,去掉female和male两列,增加sex和count两列,值分别与原表对应起来,使用这个gather函数:

gather(stu, gender, count,-grade)

结果如下,行列就转换过来了,第一个参数是原数据stu,二、三两个参数是键值对(性别,人数),第四个表示减去(除去grade列,就只转置剩下两列)

在原表中单看这两列是这样对应的:

(female, 5), (female, 4), (female, 1), (female, 2), (female, 3)

(male, 1), (male, 2), (male, 3), (male, 4), (male, 5),

就是把原变量名(属性名)做键(key),变量值做值(value)。

接下来就可以继续正常的统计分析了。

separate()

separate负责分割数据,把一个变量中就包含两个变量的数据分来(上例gather中是属性名也是一个变量,一个属性名一个变量),直接上例子:

separate()举例

构造一个新数据框stu2:

stu2<-data.frame(grade=c("A","B","C","D","E"), female_1=c(5, 4, 1, 2, 3), male_1=c(1, 2, 3, 4, 5),female_2=c(4, 5, 1, 2, 3), male_2=c(0, 2, 3, 4, 6))

跟上面stu很像,性别后面的1、2表示班级

我们先用刚才的gather函数转置一下:

stu2_new<-gather(stu2,gender_class,count,-grade)

不解释了,跟上面一样,结果如下:

但这个表仍然不是个规范二维表,我们发现有一列(gender_class)的值包含多个属性(变量),使用separate()分开,separate用法如下:

separate(data, col, into, sep (= 正则表达式), remove =TRUE,convert = FALSE, extra = "warn", fill = "warn", ...)

第一个参数放要分离的数据框;

第二个参数放要分离的列;

第三个参数是分割成的变量的列(肯定是多个),用向量表示;

第四个参数是分隔符,用正则表达式表示,或者写数字,表示从第几位分开(文档里是这样写的:

If character, is interpreted as a regular expression. The default value is a regular expression that matches any sequence of non-alphanumeric values.
If numeric, interpreted as positions to split at. Positive values start at 1 at the far-left of the string; negative value start at -1 at the far-right of the string. The length of sep should be one less than into.)

后面参数就不一一说明了,可以自己看文档

现在我们要做的就是把gender_class这一列分开:

separate(stu2_new,gender_class,c("gender","class"))

注意第三个参数是向量,用c()表示,第四个参数本来应该是"_",这里省略不写了(可能是下划线是默认分隔符?)

结果如下:

spread()

spread用来扩展表,把某一列的值(键值对)分开拆成多列。

spread(data, key, value, fill = NA, convert = FALSE, drop =TRUE, sep = NULL)

key是原来要拆的那一列的名字(变量名),value是拆出来的那些列的值应该填什么(填原表的哪一列)

下面直接上例子

spread()举例

构造数据框stu3:

name<-rep(c("Sally","Jeff","Roger","Karen","Brain"),c(2,2,2,2,2))
test<-rep(c("midterm","final"),5)
class1<-c("A","C",NA,NA,NA,NA,NA,NA,"B","B")
class2<-c(NA,NA,"D","E","C","A",NA,NA,NA,NA)
class3<-c("B","C",NA,NA,NA,NA,"C","C",NA,NA)
class4<-c(NA,NA,"A","C",NA,NA,"A","A",NA,NA)
class5<-c(NA,NA,NA,NA,"B","A",NA,NA,"A","C")
stu3<-data.frame(name,test,class1,class2,class3,class4,class5)

总共5门课,每个学生选两门,列出期中、期末成绩。

显然,原表是不整洁的数据,表头中含有变量(class1-5),所以先用gather函数。注意,这里面有很多缺失值,就可以用到上面所讲的na.rm=TRUE参数,自动去除有缺失值的记录(一条记录就是一行):

如果不写 na.rm=TRUE 的话,结果是这样的:

(未截全)

分析学生没选课的“NA”成绩是没有意义的,所以这个情况下应该舍弃有缺失值的记录。

现在这个表看起来已经很整齐了,但是每个人都有四条记录,其中每门课除了test和grade的值不一样,姓名、课程是一样的,并且很多时候,我们需要分别对期中、期末成绩进行统计分析,那么现在这个表就不利于做分类统计了。

用spread函数将test列分来成midterm和final两列,这两列的值是选的两门课的成绩。

再重复一遍,第二个参数是要拆分的那一列的列名,第三个参数是扩展出的列的值应该来自原表的哪一列的列名。

stu3_new<-gather(stu3, class, grade, class1:class5, na.rm = TRUE)
spread(stu3_new,test,grade)

结果如下:

现在得到非常整齐的仅有10条数据的表,处理起来会更加方便。

最后补充一条,现在class列显得有些冗余,直接用数字似乎更简洁,使用readr包中的parse_number()提出数字(还用到了dplyr的mutate函数),下面放出代码:

install.packages("dplyr")
install.packages("readr")
library(readr)
library(dplyr)
mutate(spread(stu3_new,test,grade),class=parse_number(class))

最终结果:

是不是整整齐齐很好看!!!(*╹▽╹*)

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

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

相关文章

生产力飙升!皮卡智能新产品上线,带你进入AIGC新纪元

最近以ChatGPT为首掀起的AIGC浪潮可谓席卷到了各行各业&#xff0c;算力和技术的提高终于到达了一个“质变”点。于是&#xff0c;皮卡智能最近也整出一个新活儿&#xff0c;以一种全新的面貌与大家见面——「神采PromeAI」 与去年上线的「AI艺术创作」不同&#xff0c;这款新产…

chatgpt赋能python:用Python画出栩栩如生的动画人物

用Python画出栩栩如生的动画人物 对于许多人来说&#xff0c;动画是一种风靡全球的艺术形式。随着技术的进步&#xff0c;动画制作变得越来越容易&#xff0c;并且有许多软件可以协助画家完成它们的工作。然而&#xff0c;像 Python 这样的编程语言不仅可以编写动画&#xff0…

数据架构中的数据问题

识别假设对于打破假设至关重要ーー而打破假设是创造力和技术创新。 近来&#xff0c;chatGPT再一次激发了人们对通用人工智能的热情&#xff0c;甚至到了人人都在谈AIGC的地步。然而&#xff0c;大模型对数据丰富性的依赖更加严重&#xff0c;面向机器学习以及深度学习的数据架…

【STR文字识别项目】之 最新SOTA项目PARSeq(一)训练自己的数据集,并转成onnx用C++调用

目录 前言 准备环境 准备数据集 训练 验证效果 导出ONNX模型 C调用 前言 首先先解释下STR和OCR的区别&#xff0c;很多人可能听说过OCR比较多&#xff0c;这两种任务有相似也有不同&#xff0c;以下是来自ChatGPT的解释。 Optical Character Recognition (OCR)和Scene …

基于Qt的酒店管理系统(毕业设计)

开发工具集&#xff1a; Qt5.12.4、VS2017、Sqlite3轻量级数据库&#xff08;免除安装数据库的烦恼&#xff09; 百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rNt6EI8uAAIuHCQeGXKinA 提取码&#xff1a;0mcn效果图 1、加载数据库部分 void Datab…

【计算机毕业设计】251毕业论文管理系统设计与实现

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本毕业论文管理系统就是在这样的大环境下诞生&a…

java毕业设计——基于java+mysql+socket的即时通讯软件设计与实现(毕业论文+程序源码)——即时通讯软件

基于javamysqlsocket的即时通讯软件设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javamysqlsocket的即时通讯软件设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模…

毕业设计-基于微信小程序的图书推荐前台系统

目录 前言 课题背景与简介 实现设计思路 一、图书推荐微信小程序前台模块设计与实现 二、前台设计关键代码 三、总结 实现效果样例 更多帮助 前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费…

基于大数据平台的毕业设计

前言 2022年最新大数据毕设文章&#xff1a; 基于大数据平台的毕业设计01&#xff1a;基于Docker的HDP集群搭建 最近有很多人问我&#xff0c;大数据专业有什么好的毕设项目&#xff0c;我就简单的回复了一下。也有直接问我要源码的… 所以就抽空写一写自己毕业设计的一个思…

博网即时通讯软件的设计与实现毕业设计(论文+PPT+源码)

幻灯片1 选题背景及意义 研究技术与方法 设计内容与模块 设计的环境、方法及措施 幻灯片2 选题背景及意义 1 即时通讯软件使人与人的沟通突破时空极限&#xff0c;突破环境极限&#xff0c;使自我突破心理极限。 1 背景 2 作为使用频率最高的网络软件&#xff0c;即时通…

数据可视化方向的毕业设计详细思路

距离我本科答辩顺利通过已经过去十几天了&#xff0c;我决定把本科阶段最后的小成果做个总结分享给想做此方向项目的小伙伴们&#xff0c;希望能让你们想在动手实操时有项目可供参考&#xff0c;有实现思路可供学习&#xff0c;演示视频先呈现给大家。 一、研究目的及意义 &a…

毕业设计-后台管理系统

关于代做毕业设计的历程&#xff1a; 关于毕设算是大学最重要和最能锻炼自己的课程设计之一了&#xff0c;但是相对于一部分大学生来说&#xff0c;要想自己凭空想出一个系统&#xff0c;而且是使用大学所学的技术是比较难做出一个像样的毕业设计&#xff0c;这是发自我个人的观…

毕业设计- 基于Android的教务管理系统(带流程图)

—— 等风来不如追风去&#xff0c;追逐的过程就是人生的意义。 项目介绍 系统用来管理班级的日常班务信息&#xff0c;系统角色分为三种管理员、班委和学生。 管理员&#xff1a;拥有最高权限&#xff0c;可以管理即增加、查询、修改和删除所有数据。 班委&#xff1a;不能申批…

本科毕业论文-软件开发类-《基于Android端开关控制系统的设计与实现》-论文模板

目 录 前言 一、任务书 二、目录 三、论文正文 摘要 ABSTRACT 1.引言 2.系统开发环境 2.1可行性分析 2.2 开发工具介绍 3.需求分析 3.1 功能需求分析 3.2 数据流程图 4.总体设计 4.1 系统整体模块设计 4.2 红外编码设计与蓝牙通信设计 4.3 系统功能结构设计 …

计算机毕业设计源码——基于Android的真人社交游戏辅助应用开发

编号 本科生毕业设计&#xff08;论文&#xff09; 题目&#xff1a; 真人社交游戏辅助应用开发 专业 学 号 学生姓名 指导教师 摘 要 时至今日&#xff0c;社交已成为人们生活中必不可少的一部分&#xff0c;社交网络的盛行已经成为一种必然趋势&#xff0e;与此同时&a…

Mixlab Insight:不同职业对GPT-4的看法

shadow LLM 、生成式人工智能&#xff0c;大量企业需要升级改造内部的岗位和工作流&#xff0c;至少包括&#xff1a;商业模式改造升级、团队岗位的职业要求和人才、虚拟/仿真的生产线。 MixGPT&#xff1a;在GPT4上线当天&#xff0c;我们开启了激烈的讨论&#xff0c;关于职业…

Android 大作业之个人博客新闻App

用到的技术&#xff1a; 网络编程、多线程编程、listview、数据库、等等 效果图 **注&#xff1a;**新闻数据来源“聚合数据”API接口&#xff0c;如果没显示出来&#xff0c;是调用次数超过了&#xff0c;最好自己申请API接口&#xff08;免费&#xff09; 本设计代码已上…

Android 优秀文章收集整理集合

转载 自 https://github.com/jiang111/awesome-android-tips 记录自己遇到的比较有价值的Android相关的blog MaHua是online md编辑器&#xff0c;挺好用。 本是自己记录一些有价值的blog&#xff0c;没成想有不少star的&#xff0c;为了方便查看&#xff0c;等有时间就会进行…

计算机技能高考素材,高中作文万能通用素材 2021高考必备作文素材

在平时的时候&#xff0c;多积累一些作文素材&#xff0c;有助于语文的写作&#xff01;下面不妨和高三网小编一起来了解下关于2021高考必备作文素材&#xff0c;希望这些素材能帮助我们在作文中有更好的发挥。 高中作文万能通用素材&#xff1a;由“提笔忘字”谈汉字传承 曾几…

四级英语图表作文真题计算机,2016年四级作文模板之图片与图表

2016年四级作文模板之图片与图表 英语四六级考试改革之后&#xff0c;图画作文考的比较多&#xff0c;无论是图画作文还是主题作文&#xff0c;下面的结构是可以通用的&#xff0c;考生可以重点记下图画作文与主题作文的句型。 一、看图作文模板 第一段&#xff1a;简要描述图画…