查看: 1529|回复: 10

[R语言] 对照着Excel入门R语言表格数据处理

  [复制链接]

管理员

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

主题
153
注册时间
2019.7.8
在线时间
243 小时

发表于 2020.6.3 10:38:30 | 显示全部楼层 |阅读模式
在之前的微信文章介绍过一些Excel处理数据教程,比如 《可以秀给师妹师弟的一些Excel“骚操作”》《如何用Excel批量查找数据?》《如何使用Excel对数据进行筛选?》等。处理简单问题时,使用Excel效率会很高,但有些时候需要对数据进行较为复杂的分类汇总,使用Excel非常“不自由”,则需要个性化程度较高的R。

这里主要推荐使用dplyr包对数据进行分类汇总,主要用到以下几个函数:arrange():数据排序,针对表格的“列”;filter():按记录数值筛选,针对表格的“行”;select():按变量名称筛选,针对表格的“列”;mutate():创建新变量(列);summarize():统计汇总;group_by():搭配上面的函数,实现强大的分组统计功能。

为了便于初学者理解记忆,接下来主要通过对照着Excel相应功能,以 《可以秀给师妹师弟的一些Excel“骚操作”》一文的范例数据为例,为大家介绍以上6个核心函数的用法。

1.数据准备

[AppleScript] 纯文本查看 复制代码
#在线安装dplyr包;
#install.packages("dplyr")
#载入dplyr包;
library(dplyr)

#改变工作目录
setwd("C:/Users/MHY/Desktop/数据的分类汇总统计")
dir()
#读入范例数据,为了方便展示数据仅15行;
dt <- read.table("Excel小技巧范例数据1.txt",header=T,sep="\t")
dt



2.数据排序


这一部分对应Excel“开始”选项卡下的排序功能,Excel也可以实现多变量排序,如下。


[AppleScript] 纯文本查看 复制代码
#按照单个变量排序,默认升序排列;
by_id <- arrange(dt,id)
#通过嵌套desc()函数实现降序排列;
by_RNA <- arrange(dt,desc(RNA_log2FC))
#可以按照多个变量排序;
by_Group_RNA1 <- arrange(dt,Group,desc(RNA_log2FC))


[AppleScript] 纯文本查看 复制代码
#组内排序;
tbl <- group_by(dt,Group)
by_Group_RNA2 <- arrange(tbl,desc(RNA_log2FC),.by_group = TRUE)
#也可配合管道符号 %>%,简化脚本,本质就是省略输入变量;
by_Group_RNA3 <- dt %>% group_by(Group) %>% arrange(desc(RNA_log2FC),.by_group = TRUE)


结果上和使用两个变量排序似乎没有区别,原以为以使用group_by不会改变分组顺序,但结果依旧做了排序。
对于前者,我们可以通过factor()指定分类水平,就可以实现按特定顺序排序的效果。

[AppleScript] 纯文本查看 复制代码
#按指定的分组顺序进行排序;
group <- factor(dt$Group,levels =unique(dt$Group),ordered = TRUE )
by_Group_RNA1 <- arrange(dt,group,desc(RNA_log2FC))


[AppleScript] 纯文本查看 复制代码
#但是如果使用group_by()则不能这样做了:Error: Column `group` is unknown
tbl <- group_by(dt,group)
# Error: Column `group` is unknown


3.数据筛选

这部分内容对应Excel“数据”选项卡下的筛选和高级筛选功能,如下。


3.1提取符合条件的行

[AppleScript] 纯文本查看 复制代码
filter(dt,dt$Group=="1379")
#特殊符号:%in% 用于指定特定值集合;
filter(dt,dt$Group %in% c("non","2846"))


[AppleScript] 纯文本查看 复制代码
#转成dplyr匹配的tibble类型;
tb <- as_tibble(dt)
tb

tibble类型更方便一些,用法和常规数据框差不多,但可以直接使用列名筛选了,接下来主要以tibble为范例。

这里的filter的用法类似于基础函数subset(),平常大家最常用的可能是subset()。

[AppleScript] 纯文本查看 复制代码
#以下两种写法等价:外扩号让变量直接打印出来;
(filted <- filter(tb,RNA_log2FC <= -1 | RNA_log2FC>=1))
(subdf <- subset(tb,RNA_log2FC <= -1 | RNA_log2FC>=1))
#下面是同时满足两个条件的等价写法:
(filted <- filter(tb,Ribo_log2FC >= 1 , RNA_log2FC>=0))
(filted <- filter(tb,Ribo_log2FC >= 1 & RNA_log2FC>=0))



3.2提取满足特定条件的列

[AppleScript] 纯文本查看 复制代码
#select()函数可以选择特定的列,组成新的表格;
select(tb,RNA_log2FC,Group)
select()函数还可以使用辅助函数,starts_with(),contains(),matchs(),num_range()等进行模糊匹配;如num_range("CK",1:3),matchs()支持正则表达式。
select(tb,ends_with("log2FC"))
select(tb,starts_with("RNA_"),Group)



4.新列生成

mutate()函数对列向量进行计算,将计算结果展示在新的列里边。非常方便对原来的变量进行处理比如取对数,计算百分比等。

[AppleScript] 纯文本查看 复制代码
#mutate()
mutate(tb,RNA_FC = 2^RNA_log2FC)
mutate(tb,Sum = RNA_log2FC+Ribo_log2FC)


Tips:当然也可以使用apply()基础函数:对矩阵、数据框所有的行或列(1表示按行,2表示按列)进行计算。但得到结果是向量,并没有整合到原来的表格上,需手动整合。

[AppleScript] 纯文本查看 复制代码
(Sum <- apply(tb[,2:3],1,sum))
(new <- tibble(tb,Sum))


这部分对应Excel添加公式进行批量计算的操作,如下图。


5.统计汇总


这部分内容对应Excel“数据”选项卡下的分类汇总功能,如下图。


dplyr主要使用summarise()函数进行统计分析,当然这使用apply()函数也可以做到,但结合上group_by()函数可实现按照分组进行“分类汇总”。

[AppleScript] 纯文本查看 复制代码
#summarise()统计最大值,结果为单列表格。列名这里是'max(RNA_log2FC)',当然也可以在统计函数前指定生成数据的列名。
summarise(tb,max(RNA_log2FC))


[AppleScript] 纯文本查看 复制代码
#分类汇总
#统计每个分组的记录数量;
Num<-tb %>% group_by(Group) %>% summarise(num=n())
Num
#计算分组的均值;
Mean<-tb %>% group_by(Group) %>% summarise(mean(RNA_log2FC))
Mean
#转成常规数据框;
(Mean<-as.data.frame(Mean))



这里的功能有点类似aggregate()函数,aggregate()的特点是对所有列的数据进行分类汇总,包括用于分组的列。

Tips:aggregate /ˈæɡrɪɡət/ 合计、总计

[AppleScript] 纯文本查看 复制代码
#统计每个分组的记录数量;
(am_length <- aggregate(tb, by=list(group), FUN=length))
#也可指定对某些列进行分类汇总;
(am_mpg_mean <- aggregate(tb["RNA_log2FC"], by=list(group), FUN=mean))



[AppleScript] 纯文本查看 复制代码
FUN参数可以用的统计函数有mean、median、sd、var、sum、lengh、min、max等,当然也可自定义函数。
#自定义nf函数;
nf<-function(x){round(sum(x*2),2)}
(am_nf <- aggregate(tb["RNA_log2FC"], by=list(group), FUN=nf))
#对于nf函数,当然summarise()函数也是适用的;
nf_res<-tb %>% group_by(Group) %>% summarise(nf(RNA_log2FC))
nf_res



和上面的排序部分一样,前者的分组顺序可指定,而后者的分组顺序自己进行了升序排列。
好啦,今天的dplyr学习笔记就分享到这里啦!

参考资料
https://cran.r-project.org/web/packages/dplyr/index.html
https://r4ds.had.co.nz/



本文作者:基迪奥-莫北

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
新的一天加油!
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
1
注册时间
2020.5.28
在线时间
4 小时

发表于 2020.6.3 11:22:00 | 显示全部楼层
111111
新的一天加油!
回复

使用道具 举报

草履虫

Rank: 2

主题
0
注册时间
2020.6.3
在线时间
1 小时

发表于 2020.6.3 22:46:36 | 显示全部楼层
膜拜
回复

使用道具 举报

帝王蝶

Rank: 4

主题
0
注册时间
2016.12.6
在线时间
134 小时

发表于 2020.6.4 11:24:12 | 显示全部楼层
厉害,厉害,,,
回复

使用道具 举报

帝王蝶

Rank: 4

主题
3
注册时间
2019.3.2
在线时间
157 小时

发表于 2020.6.4 12:23:45 | 显示全部楼层
32个赞
回复

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2020.5.14
在线时间
3 小时

发表于 2020.6.10 20:43:44 | 显示全部楼层
膜拜,学习了
新的一天加油啊
回复 支持 反对

使用道具 举报

钵水母

Rank: 3Rank: 3

主题
0
注册时间
2020.5.14
在线时间
3 小时

发表于 2020.6.11 16:06:39 | 显示全部楼层
顶一下~
新的一天加油啊
回复

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
1
注册时间
2016.4.8
在线时间
733 小时

发表于 2020.6.16 09:14:37 | 显示全部楼层
好一笔骚操作
回复 支持 反对

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
1
注册时间
2016.4.8
在线时间
733 小时

发表于 2020.6.18 16:02:32 | 显示全部楼层
不断学习新鲜知识,
回复 支持 反对

使用道具 举报

迅猛龙

Rank: 8Rank: 8

主题
1
注册时间
2016.4.8
在线时间
733 小时

发表于 2020.6.19 08:22:08 | 显示全部楼层
没有时间学习怎么办,是不是没救
回复 支持 反对

使用道具 举报

管理员

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

主题
200
注册时间
2017.7.3
在线时间
493 小时

活跃会员荣誉管理


发表于 4 天前 | 显示全部楼层
qinyuan 发表于 2020.6.19 08:22
没有时间学习怎么办,是不是没救

新的一天加油!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表