大家在学习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)
)