生信代码:数据处理( tidyverse包)

2021-02-19 10:29:43 浏览数 (1)

大家在学习R语言的时候,大多参考《R语言实战》这本书,但这本书年代过于久远(中文第二版是2016年),主要着力点也是在R base上,R语言可视化的ggplot2包也只是简要介绍,而对于tidyverse包,《R语言实战》并未涉及,这也导致R语言的学习难度增加,今天我们给大家引入tidyverse包的学习。

tidyverse 包是 Hadley Wickham 及团队的集大成之作,是专为数据科学而开发的一系列包的合集, 基于整洁数据,提供了一致的底层设计、语法、数据结构,包括数据导入,数据规整,数据处理,可视化,建模以及形成可重复性报告数据分析的全流程。

在Rstudio中加载tidyverse包,可以看到该包下有8个子包,著名的ggplot2包即是其中的一个子集,我们先着重讲一下数据处理有关的包——dplyr包。

dplyr包下主要是以下几个操作:

  • select()——选择列
  • filter/slice()——筛选行
  • arrange()——对行进行排序
  • mutate()——修改列/创建列
  • summarize()——汇总数据

而这些函数都可以与group_by结合,分组对原数据框进行处理。

1

mutate()

mutate()与基础函数transform()相似,都可以添加新的一列,但是允许引用刚刚创建的列:

代码语言:javascript复制
mydata <- tibble(x1=c(2,2,6,4),
               x2=c(3,4,2,8))
##传统方法
  mydata$sum <- mydata$x1 mydata$x2
  mydata <-transform(mydata,sumx=x1 x2)
  attach(mydata)
  sum <- x1 x2
  detach(mydata)
##dplyr
  mydata %>% mutate(sumx=x1 x2,
                  meanx=sumx/4)##dplyr允许使用管道%>%操作,且meanx可以引用sumx

2

select()

select()使我们能够快速聚焦在有用的数据子集上:

代码语言:javascript复制
df <- tibble(
      name = c("Alice", "Alice", "Bob", "Bob", "Carol", "Carol"),
      type = c("english", "math", "english", "math", "english", "math"),
      score = c(95, 83, 89, 67, 90, 78)
)
df %>% select(1,2) ##选取1,2列
df %>% select(name,score)
df %>% select(-3)
##同样也可以用start_with 或 end_with筛选出具有前缀或者后缀的列
df %>% select(start_with("n"))

3

filter()

filter()是对数据行方向的选择和筛选,选出符合我们条件的某些行:

代码语言:javascript复制
df %>% filter( type== "english", score>85)
df %>% filter( between(score, 80, 90))

4

summarize()

summarize()主要用于统计,往往与其他函数配合使用,比如计算所有同学考试成绩的均值:

代码语言:javascript复制
df %>% 
  filter(type=="english")%>%
  summarize(
          mean_english==mean(score)
          sd_english=sd(score)
          )
##summarize返回的是一个新的数据框,如果后续要使用到,需要保存下来

5

arrange()

R base包中涉及到排序的包括 sort(),rank(),order(),而在dplyr包中与排序相关的是arrange()包,默认是从高到低进行排序,如果变换排序顺序则可以使用-(变量)或者desc(变量)。

代码语言:javascript复制
df %>% arrange(score)
df %>% arrange(-score)
df %>% arrange(desc(score))
df %>% arrange(type, score) #先对type进行排序,再对score进行排序

6

group_by()

group_by可以对原数据框进行分组计算,例如对于我们本文中的数据框,我们如果对个人或者科目感兴趣的话,可以使用group_by(name或者type),然后利用summarize函数就可以求出分类之后的各个统计值。

代码语言:javascript复制
df %>% 
  group_by(name) %>% 
  summarise( 
    mean_score = mean(newscore),
    sd_score = sd(newscore)
  )

0 人点赞