16. Tidyverse
- Introduce
tidyverse
就是Hadley Wickham将自己所写的包整理成了一整套数据处理的方法.简单来说是package的集合.下面从各个功能来介绍
Tidyverse
的使用.我们先把数据读入.dog_info = read.table(file='dog_info.tsv',row.name=1,head=T) dog_scores = read.table(file='dog_scores.tsv')
- 数据格式转换
在
tidyverse
旧版,我们要用tidyverse
处理表格类数据,需要先去除表格的行名.这是tibble
的数据结构,可以称为tibble
,但现在新版支持,所以可以不去除行名(旧版是部分指令比如select不支持).下面主要用tidyr
和tibble
两个包.虽然
tidyverse
现在可以处理DataFrame
格式,但处理时还是尽量转成tibble
的格式.主要是tibble
有一些特点,比如读取快,不会改变表的数据格式等,现在R主要还是使用tibble
.2.1 行列转换
可以理解为转置.
t(dog_scores)
2.2 行名转列
就是把行名变成一列.负责这个的函数在tibble包内.
library(tibble)
- var 表示行名转列,新列的列名
rownames_to_column(dog_scores,var='dog')
题外话,我们可以输入
?指令
来查看当前指令的帮助文档.2.3 列转行名
将列转行名.要注意的是行名是
Index
,不允许重复.#这里的var 表示要转换的列 column_to_rownames(rownames_to_column(dog_scores,var='dog'),var='dog')
2.4 长宽转换
把宽表格转为长表格,反之同理.
- 宽转长
# 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,表示第一列除外
- 长转宽
pivot_wider(dog_score3,names_from='subject',values_from='scores') #names_from : 列名来源 #values_from : 值来源
插句题外话,我们在加载
tidyverse
的时候,会提示warning
.√
表示已经加载进来,而conflicts
后面表示dplyr::filter
替代了stats::filter
.如果我们要用stats::filter
,就必须前称全写. - dplyer 数据处理
dplyer是核心包.照常,我们需要先把数据格式转为无行名的格式.
dog_info2 = rownames_to_column(dog_info,var='dog') dog_info2
3.1 数据筛选 filter
首先是按列筛选,这里举个年龄% mutate(rate=row_number())
- 双表关联
类似
Sql
的操作.这个定义在
sql
里也有,无需赘述了.left_join(dog_score2,dog_info2,by='dog')
和
sql
一样,存在一种情况,两个相关联的表,键名并不关联.我们修改了dog_info
的表,改成dog_modified
.read.table(file='dog_modified.tsv') %>% rownames_to_column(var='dog') -> dog_info3 dog_info3
我们
left_join
以左表为主,会保留左表存在的行名,left_join(dog_score2,dog_info3,by='dog')
这边一起概括了,如果是右表为主,就是
right_join
.如果要两边表的行名都保留,就是full_join
.只保留交集是inner_join
但是同样存在列名不一致的情况.这种时候就需要指定列名.
read.table(file='dog_modified.tsv') %>% rownames_to_column(var='Dog') -> dog_info3 inner_join(dog_score2,dog_info3,by=c('dog'='Dog'))
- 分组统计
我们将表中数据分组再统计.类似
Pandas
的groupby
.下面代码表示将表按年龄排序,但是分组结果并没有可视化.group_by(dog_info2,age)
需要配合其他函数才能可视化.
summarise(count = n())
的summarise
是聚合统计,新增一个count
列,它的值是n()n()n()统计组内个数.这个函数和summarize()
很像,其实没有什么不同,只是拼写不一样. 摘自Clickdplyr 中的summarise函数是一种重要的数据汇总统计函数,它可以对数据框中的变量进行聚合操作,计算出每个变量的总和、均值、中位数、标准差等统计量,或者进行自定义的聚合操作。通过summarise函数,我们可以快速、高效地计算出每个变量的统计量,并对数据框进行分组汇总统计。熟练掌握summarise函数的用法,可以大大提高我们的数据处理效率。`
group_by(dog_info2,age) %>% summarise(count = n())
同样结果可以配合其他函数使用,比如只保留分组个数大于1只的组.但是下面的代码没有保留原来
dog
的信息.group_by(dog_info2,age) %>% summarise(count = n()) %>% filter(count > 1)
如果要保留信息,直接
filter
即可.group_by(dog_info2,age) %>% filter(n() > 1)
- 导出
7.1 表数据
读取是
read
,对应的导出就是write
.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的数据文件 save(dog_info,dog_info2,file='dog.Rdata') #读取R的数据文件 load(file='dog.Rdata')
我们使用
RStudio
切换工作路径或者退出的时候,会询问是否保持Rdata
.如果选是,就保存到.RData
里,下次会自动Load
. - 官方文档
可以去
RStudio
官网找参考卡片,介绍每个包的使用方式.会出现很多,挑自己想看的即可.
.
这个博客总结的也挺好的,虽然是很久以前的Click.