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.

相关推荐
hxung2 分钟前
springboot项目中常用的工具类和api
数据库·spring boot·后端
唐人街都是苦瓜脸5 分钟前
SpringBoot的简单介绍
java·spring boot·后端
xq51486325 分钟前
Spring Boot 自动装配原理
java·spring boot·后端
阮瑭雅1 小时前
Python语言的网络安全
开发语言·后端·golang
淳于韻珊1 小时前
R语言的跨平台开发
开发语言·后端·golang
桑榆08062 小时前
Scala数组
开发语言·后端·scala
bobz9652 小时前
GUI 开发工具 QT VS .NET
后端
东方窅瞳2 小时前
MDX语言的云计算
开发语言·后端·golang