R语言做生信R小推车

《R数据科学》||5-9章 readr+tidyr+dplyr+

2019-02-26  本文已影响33人  Dawn_WangTP
r4ds

终于安排上了时间再把《R数据科学》这本书学习了一遍。以下是学习的过程中的一些参考资料,分享一下。

  1. 英文原版在线https://r4ds.had.co.nz/index.html
  2. 中文翻译版已有售,建议纸质版书籍随时翻翻。电子版网盘分享 https://pan.baidu.com/s/1fkpqYahQHPkwx66XD2gGGg 提取码: akct
  3. 最近才公布的课后习题参考答案https://jrnold.github.io/r4ds-exercise-solutions/
  4. Rstudio的一些便捷CheetSheetshttps://www.rstudio.com/resources/cheatsheets/
  5. 另外在写代码过程中Rstudio操作时的方便快捷键:赋值<- Alt+“减号” ;管道符%>% Ctrl+Shift+M

第五章,探索性数据分析 exploratory data analysis(EDA)

变动:是一个变量内部的行为,每次测量时数据值的变化趋势。
相关变动:两个或多个变量以相关的方式共同变化所表现出的趋势。多个变量之间的行为。
模式:如果两个变量之间存在系统性的关系,那么这种关系就会再数据中表示一种模式。

5.3 变动

一维数据的表示:geom_bar(binwidth=1)可以对一维连续变量进行分箱,然后使用条形的高度表示落入箱中的数量。并且对于geom_bar(),geom_histogram()可以利用geom_freqpoly()替代,此为叠加的折线图,并可以在折线图内aes(color= *)参数映射其它数据。

异常值:可用图层coord_cartesian(ylim=c(0,50))滤出(不显示,但会保留)大于此取值的,而不是ylim(0,50)直接丢弃。

## 5.3 变动,分布进行可视化表示
ggplot(data = diamonds)+geom_bar(mapping = aes(x=cut))
ggplot(data = diamonds)+geom_bar(mapping = aes(x=carat),binwidth = 0.5)
diamonds %>% filter(carat<3) %>% ggplot(mapping = aes(x=carat))+geom_histogram(binwidth = 0.1)
diamonds %>% filter(carat<3) %>% ggplot(mapping = aes(x=carat))+ geom_freqpoly(aes(color=cut),binwidth=0.1)+scale_color_brewer(palette = "Set1")

### 5.3.3异常值,
ggplot(diamonds)+geom_histogram(mapping = aes(x=y),binwidth = 0.5)+ylim(0,60)
ggplot(diamonds)+geom_histogram(mapping = aes(x=y),binwidth = 0.5)+coord_cartesian(ylim = c(0,60))

# 5.4 异常值,推荐是将异常值改为缺失值处理。
diamonds %>% filter(between(y,3,20))
#### mutate()创建新变量代替原来的变量
diamonds <- diamonds %>% mutate(y=ifelse(y<3 | y>30,NA,y))
diamonds <- select(diamonds,-(`ifelse(y < 3 | y > 30, NA, y)`))
ggplot(diamonds,aes(x=x,y=y))+geom_point(na.rm = T)
flights %>% mutate(cancelled=is.na(dep_time),sched_hour=sched_dep_time%/%100,sched_min=sched_dep_time%%100,sched_depart_time=sched_hour+sched_min/60) %>% select(sched_hour,sched_min,sched_depart_time,everything()) %>% ggplot(aes(x=sched_depart_time))+geom_freqpoly(aes(color=cancelled),binwidth=1/5)


5.5 相关变动

5.6 模式和模型:如果两个变量之间存在系统性的关系,那么这种关系就会再数据中表示一种模式。

# 5.5 相关变动:两个或者多个变量间的关系。
ggplot(diamonds,mapping = aes(x=price))+geom_freqpoly(aes(color=cut),binwidth=500)
ggplot(diamonds)+geom_freqpoly(aes(x=price,y=..density..,color=cut),binwidth=200)+scale_color_brewer(palette = "Set2")
###mpg
ggplot(mpg,mapping = aes(x=class,y=hwy))+geom_boxplot()
ggplot(mpg)+geom_boxplot(mapping = aes(x=reorder(class,hwy,FUN = mean),y=hwy,fill=class))
ggplot(mpg)+geom_boxplot(mapping = aes(x=reorder(class,hwy,FUN=median),y=hwy))+coord_flip()

### 5.5.1分类变量与连续变量



### 5.5.2俩个分类变量间的关系,geom_tile(aes(fill=count))
ggplot(data = diamonds)+geom_count(mapping = aes(x=cut,y=color))
diamonds %>% count(color,cut) %>% ggplot()+geom_tile(aes(x=color,y=cut,fill=n))

### 5.5.3 两个连续变量
geom_point()
geom_bin2d() ## 对连续变量的数据做分箱处理。
geom_hex()
diamonds %>% ggplot(aes(carat,price))+geom_hex()

第七章. tibble表

是对传统R中的data.frame的升级版替换。

第八章. 使用readr进行数据的导入

8.1 常用的tidyverse所提供的数据导入的方式:

8.2 以read_csv()为例,内部提供的函数:

8.3 解析向量:主要依靠parse_*()函数族解析,第一个参数为需要解析的字符向量,na参数设定 缺失值处理na=".",函数族包括parse_logical(), parse_double(), character(), factor(), datetime().

8.4 解析文件:readr会通过文件的前1000行以启发式算法guess_parser()返回readr最可信的猜测,接着用parse_guess()使用这个猜测来解析列。

8.5 写入文件和其它导入文件:

第九章. 使用dplyr处理关系数据,多个数据表。

综合多个表中的数据来解决感兴趣的问题。存在于多个表中的数据称为关系数据。且关系总是定义于两个表之间的。 包括有三类操作处理关系数据:

基本数据的准备包括nycflights13包中的几个表。airlines/airports/planes/weather等。

9.3 键:唯一标识观测的变量

9.4 合并连接:通过两个表中的键(变量们)来匹配观测(行数值),再将一个表中的变量复制到另一个表格中。 对比cheatsheet中的信息

9.5 筛选连接:根据键来对观测数值进行筛选

9.6整理数据时需要对数据进行整理:

  1. 需要找出每个表中可以作为主键的变量。应基于数据的真实含义来找主键
  2. 确保主键中的每个变量没有缺失值,如果有缺失值则不能被识别!
  3. 检查主键是否可以与另一个表中的外键相匹配。利用anti_join()来确定。

9.7集合的操作:

library(tidyverse)
library(nycflights13)
planes;airports;airlines;weather;


## 9.3键
weather %>% count(year,month,day,hour,origin) %>% filter(n>1) ### 筛选唯一的键

## 9.4 合并连接
flights2 <- flights %>% select(year:day,hour,origin,dest,tailnum,carrier)
flights2 %>% select(-(hour:origin)) %>% left_join(airlines,by = "carrier")
flights2 %>% select(-(hour:origin)) %>% right_join(airlines,by = "carrier")

flights2 %>% left_join(weather) ## 自然连接,使用存在于两个表中的所有变量。
flights2 %>% left_join(planes,by = "tailnum") ## 共有的
flights2 %>% left_join(airports,c("origin" = "faa"))


### exercise
##9.4.6-1目的地的平均延误时间,与空间分布。
flights %>% group_by(dest) %>% summarise(dest_delay=mean(arr_delay,na.rm = T)) %>% left_join(airports,c("dest"="faa")) %>% filter(dest_delay>0)%>%ggplot(aes(lon,lat))+borders("state")+geom_point(aes(size=dest_delay))

airports %>% semi_join(flights,c("faa"="dest")) %>% ggplot(aes(lon,lat))+borders("state")+geom_point()
##exercise3 飞机的机龄与延误时间
flights %>% group_by(tailnum) %>% summarise(count=n(),delay_tailnum=mean(arr_delay,na.rm = T)) %>% left_join(planes,by="tailnum") %>% filter(!is.na(year)) %>% ggplot(aes(x=delay_tailnum))+geom_freqpoly(aes(color=year),binwidth=1)
###geom_ribbon作图

## 9.5 筛选连接
(top_dest <- flights %>% count(dest,sort = T) %>% head(10))
flights %>% filter(dest %in% top_dest$dest)

flights %>% semi_join(top_dest,by = "dest")

使用tidyr整理数据表 Tidy data

这一章在中文版里并没有,所以跟着英文在线版的学。

整洁的数据基本准则(以tidyr内部数据table1,table2,table3,table4a,table4b)为例:

整理数据表,应对一个变量对应多行 or 一个观测对应多行的问题。利用gatherspread()

## 1 tidy_data
#### compare different dataset
table1
table2
table3
table4a;table4b

table1 %>% mutate(rate=cases/population *10000)
table1 %>% count(year,wt=cases)
ggplot(table1,aes(year,cases)) + geom_line(aes(color=country))+geom_point(color="grey")


## 2 gather()
table4a
table4a %>% gather(`1999`,`2000`,key = "year",value = "cases")
table4b %>% gather(`1999`,`2000`,key="year",value="population")
left_join(table4a,table4b,by=c("country","year"))

## 3 spread()
table2
table2 %>% spread(key = type,value = count)

stocks <- tibble(
  year=c(2015,2015,2016,2016),
  half=c(1,2,1,2),
  return=c(1.88,0.59,0.92,0.17)
)
stocks

stocks %>% spread(year,return) %>% gather("year","return",`2015`,`2016`)


## 综合操作
who %>%
  gather(new_sp_m014:newrel_f65,key="key",value="count",na.rm = T) %>%
  mutate(key=str_replace(key,"newrel","new_rel")) %>%
  separate(key,into = c("new","var","sexage"),sep="_") %>%
  select(-iso2,-iso3,-new) %>%
  separate(sexage,into = c("sex","age"),sep=1)


上一篇 下一篇

猜你喜欢

热点阅读