16. Tidyverse

1. Introduce

tidyverse就是Hadley Wickham将自己所写的包整理成了一整套数据处理的方法.简单来说是package的集合.

下面从各个功能来介绍Tidyverse的使用.我们先把数据读入.

R 复制代码
dog_info = read.table(file='dog_info.tsv',row.name=1,head=T)
dog_scores = read.table(file='dog_scores.tsv')

2. 数据格式转换

tidyverse旧版,我们要用tidyverse处理表格类数据,需要先去除表格的行名.这是tibble的数据结构,可以称为tibble,但现在新版支持,所以可以不去除行名(旧版是部分指令比如select不支持).下面主要用tidyrtibble两个包.

虽然tidyverse现在可以处理DataFrame格式,但处理时还是尽量转成tibble的格式.主要是tibble有一些特点,比如读取快,不会改变表的数据格式等,现在R主要还是使用tibble.

2.1 行列转换

可以理解为转置.

R 复制代码
t(dog_scores)

2.2 行名转列

就是把行名变成一列.负责这个的函数在tibble包内.

R 复制代码
library(tibble)
# var 表示行名转列,新列的列名
rownames_to_column(dog_scores,var='dog')

题外话,我们可以输入?指令来查看当前指令的帮助文档.

2.3 列转行名

将列转行名.要注意的是行名是Index,不允许重复.

R 复制代码
#这里的var 表示要转换的列
column_to_rownames(rownames_to_column(dog_scores,var='dog'),var='dog')

2.4 长宽转换

把宽表格转为长表格,反之同理.

  • 宽转长
r 复制代码
# var 表示行名转列,新列的列名
dog_score2 = rownames_to_column(dog_scores,var='dog')
#先去除行名
library(tidyverse)
#将宽表格转为长表格 
dog_score3 = pivot_longer(dog_score2,c(2,3,4),names_to='subject',values_to='scores')
#names_to = 表示列名转换成值后,对应列的列名 比如上图的 yuwen shuxue wuli
#values_to = 表示原表的值转化成列值的新列名 比如 88 55 44
#c(2,3,4)是要转换的列,我们也可以用列名指定 还可以写-1,表示第一列除外
  • 长转宽
r 复制代码
pivot_wider(dog_score3,names_from='subject',values_from='scores')
#names_from : 列名来源
#values_from : 值来源

插句题外话,我们在加载tidyverse的时候,会提示warning.表示已经加载进来,而conflicts后面表示dplyr::filter替代了stats::filter.如果我们要用stats::filter,就必须前称全写.

3. dplyer 数据处理

dplyer是核心包.照常,我们需要先把数据格式转为无行名的格式.

R 复制代码
dog_info2 = rownames_to_column(dog_info,var='dog')
dog_info2

3.1 数据筛选 filter

首先是按列筛选,这里举个年龄 <math xmlns="http://www.w3.org/1998/Math/MathML"> < 6 <6 </math><6的例子.

R 复制代码
filter(dog_info2,age < 6)

也可以合并条件

R 复制代码
filter(dog_info2,age < 6 & age > 3)

3.2 列增加/列修改 mutate

使用时,通常你只需要指定3项内容:

  • 您要修改的数据框的名称
  • 您将创建的新变量的名称
  • 您将分配给新变量的值

注意,mutate()的第二个参数是"名称-值"对,就是说我们在创建变量时新变量需要一个名称,但是它也需要一个分配给该名称的值.因此,当使用mutate时,您需要提供名称和新值.

R 复制代码
dog_score4 = mutate(dog_score2,total = yuwen + shuxue + wuli)
dog_score4
R 复制代码
dog_score4 = mutate(dog_score2,total = yuwen + shuxue + wuli + 10)
dog_score4

列值也可以使用函数

R 复制代码
 mutate(dog_score5,rate=row_number())

3.3 列排序 arrange

这个函数居然不是sort...

R 复制代码
arrange(dog_score4,total)
#第二个参数往后表示排序的key
#默认降序,下面升序
arrange(dog_score4,desc(total),shuxue)
#表示按total降序排列,如果相等就按shuxue升序排列

3.4 列选择

这种有多个用法,可以删除列.

R 复制代码
#选择要保留的列
select(dog_score5,dog,yuwen,shuxue,wuli)
#选择要删除的列
select(dog_score5,-total)

4. 管道

管道可以将不同的指令运行结果连接起来.比如下面我们建立tibble后,删除其中一列.

管道符号的快捷键是ctrl+shift+M.逻辑有点类似Linux.

R 复制代码
rownames_to_column(dog_scores,var='dog') %>% 
  select(-wuli) %>% 
  mutate(total = yuwen + shuxue) %>% 
  arrange(desc(total),desc(yuwen)) %>% 
  mutate(rate=row_number())

5. 双表关联

类似Sql的操作.

这个定义在sql里也有,无需赘述了.

R 复制代码
left_join(dog_score2,dog_info2,by='dog')

sql一样,存在一种情况,两个相关联的表,键名并不关联.我们修改了dog_info的表,改成dog_modified.

R 复制代码
read.table(file='dog_modified.tsv') %>% 
  rownames_to_column(var='dog') -> dog_info3
dog_info3

我们left_join以左表为主,会保留左表存在的行名,

R 复制代码
left_join(dog_score2,dog_info3,by='dog')

这边一起概括了,如果是右表为主,就是right_join.如果要两边表的行名都保留,就是full_join.只保留交集是inner_join

但是同样存在列名不一致的情况.这种时候就需要指定列名.

R 复制代码
read.table(file='dog_modified.tsv') %>% 
  rownames_to_column(var='Dog') -> dog_info3
  inner_join(dog_score2,dog_info3,by=c('dog'='Dog'))

6. 分组统计

我们将表中数据分组再统计.类似Pandasgroupby.下面代码表示将表按年龄排序,但是分组结果并没有可视化.

R 复制代码
group_by(dog_info2,age)

需要配合其他函数才能可视化.summarise(count = n())summarise是聚合统计,新增一个count列,它的值是 <math xmlns="http://www.w3.org/1998/Math/MathML"> n ( ) n() </math>n()统计组内个数.这个函数和summarize()很像,其实没有什么不同,只是拼写不一样. 摘自Click

dplyr 中的summarise函数是一种重要的数据汇总统计函数,它可以对数据框中的变量进行聚合操作,计算出每个变量的总和、均值、中位数、标准差等统计量,或者进行自定义的聚合操作。通过summarise函数,我们可以快速、高效地计算出每个变量的统计量,并对数据框进行分组汇总统计。熟练掌握summarise函数的用法,可以大大提高我们的数据处理效率。`

r 复制代码
group_by(dog_info2,age) %>%
  summarise(count = n())

同样结果可以配合其他函数使用,比如只保留分组个数大于1只的组.但是下面的代码没有保留原来dog的信息.

R 复制代码
group_by(dog_info2,age) %>%
  summarise(count = n()) %>% 
  filter(count > 1)

如果要保留信息,直接filter即可.

R 复制代码
group_by(dog_info2,age) %>%
  filter(n() > 1)

7. 导出

7.1 表数据

读取是read,对应的导出就是write.

R 复制代码
write.table(dog_info3,file='dog_info3.tsv',sep='\t',quote=F,row.names = F)
  • file: 文件路径
  • sep: 分隔符
  • quote: 如果为T,每个单元格会用引号引起来.
  • row.names: 是否保留行名.

7.2 变量数据

变量数据保存使用save.

R 复制代码
#保留到R的数据文件
save(dog_info,dog_info2,file='dog.Rdata')
#读取R的数据文件
load(file='dog.Rdata')

我们使用RStudio切换工作路径或者退出的时候,会询问是否保持Rdata.如果选是,就保存到.RData里,下次会自动Load.

8. 官方文档

可以去RStudio官网找参考卡片,介绍每个包的使用方式.

  会出现很多,挑自己想看的即可.

.

这个博客总结的也挺好的,虽然是很久以前的Click.

相关推荐
程序员爱钓鱼12 分钟前
defer关键字:延迟调用机制-《Go语言实战指南》
开发语言·后端·golang
集成显卡1 小时前
网页 H5 微应用接入钉钉自动登录
前端·后端·钉钉
fashia3 小时前
Java转Go日记(三十九):Gorm查询
开发语言·后端·golang·go
Kookoos4 小时前
使用 ABP vNext 集成 MinIO 构建高可用 BLOB 存储服务
后端·c#·.net·.netcore·minio·blob
蒂法就是我5 小时前
Spring的后置处理器是干什么用的?扩展点又是什么?
java·后端·spring
CodeLinghu5 小时前
宝塔面板部署前后端项目SpringBoot+Vue2
java·spring boot·后端
嘵奇7 小时前
Spring Boot中Redis序列化配置详解
spring boot·redis·后端
黄暄9 小时前
Linux项目部署全攻略:从环境搭建到前后端部署实战
java·linux·运维·服务器·前端·后端·持续部署
鬣主任10 小时前
入职软件开发与实施工程师了后........
后端
薯条不要番茄酱10 小时前
【SpringBoot】从零开始全面解析SpringMVC (三)
java·spring boot·后端