R数据科学之日常积累

刘小泽开始写于18.9.4晚,这必定是一个持续性更新的过程
昨天jimmy一发朋友圈,单篇阅读量很快超过了我们的关注人数😂开心之余,今晚拿起了数据科学这本书看了起来~

正如书的安排,将第一部分分给了可视化,确实让人耳目一新,学习R可视化并且用最好用的ggplot2工具,让学习变成一种享受。
我会按学习的内容梳理重点问题

前言

数据处理流程

需要整洁的数据tidy data

每一列是一个变量,每一行是一个观测

需要安装tidyverse包

包括了ggplot2/tibble/readr/purrr/dplyr,使用tidyverse_update()检查更新

指定对象

包的名称后用两个冒号,如dplyr::mutate()

ggplot绘图

绘图模版

ggplot(data = <DATA>) +
    <GEOM_FUNCTION>(mapping = aes(<MAPPING>))

这个思路很棒!也讲出了ggplot的作图逻辑

  • 无论什么图,首先需要输入的就是数据集<DATA> ,这时绘制的是一张白纸;
  • 接下来就看你需要做什么图了,就是选择几何对象的过程,比如要做散点图,就将<GEOM_FUNCTION> 替换成geom_point;
  • 有了几何对象,接下来就要考虑,我们数据集中的数据怎么映射上去呢,x轴代表什么,y轴又代表什么呢?这个就是<MAPPING> 需要做的事情——指定映射变量;
  • 指定完变量后,就要想,怎么设置字体大小(size),形状(shape)、【填充|边框】颜色(fill | color)、透明度(alpha)等等,这些叫图形属性,也都是在<GEOM_FUNCTION> 中完成;
  • 绘制完一个图层后,当然可以继续新加图层,覆盖到原来之上(比如这里的散点图)

绘图注意

  1. 不要将无序变量映射为有序图形属性,什么样的变量就用什么样的属性

    有序图形属性包括:size;无序属性包括:shape、size
    进行图形属性设置时,有的属性是有序的图形属性,比如size,就是它是和数据的大小顺序有关的,反映出来的结果应该是:数值越大,点的大小越大。
    但是如果用一个无序的变量(比如mpg数据集中的class变量,它只是一个分类的作用)去映射size,结果就会根据不同类别的class表现大小,基本上结果是看不出来什么问题的

    ggplot(data = mpg)+
      geom_point(mapping = aes(x = displ, y = hwy, size= class))
    
不好的搭配
  1. ggplot2最多同时使用6种形状

  2. 绘图模版的倒数第二条中,设置颜色用字符串,设置大小用毫米,设置形状用数值。关于形状:

    空心-边界颜色-color 【0-14】
    实心-填充颜色-color;【15-20】
    填充-边界颜色-color,填充颜色-fill【21-24】
    
形状设置
  1. 一行代码写不完,可以用+然后换行,但是+必须在结尾

  2. 图形分面:特别适合添加分类变量
    单个变量:facet_wrap(~变量,nrow=)
    两个变量:facet_grid(变量1~变量2)

  3. ggplot中有大于30种几何对象,就是做出来的图形,但是对于不用的图进行设置的属性也有些差别,比如:带线的图就不能用点图的shape设置形状,可以用linetype设置实线、虚线等

  4. show.legend=T/F设置是否显示图例

  5. 创建表格可以用

    demo <- tribble(
     ~a, ~b,
     "bar_1", 20,
     "bar_2", 30,
     "bar_3", 40)
    
  6. 在<GEOM_FUNCTION>()中还可以添加统计变换

     #stat_summary:汇总统计,主要计算数据集合的最大值、最小值、平均数等;
     #stat_bin:封箱统计,将数据划分成一个个的区域,然后在外面嵌套汇总统计;
     #stat_smooth:线性回归、非线性回归以及各种平滑插值算法,用于查找数据的规律;
     #stat_density:样本估计总体的概率密度;
    
  7. 位置调整position

    #选项1.identity
    ggplot(diamonds,aes(x=cut, fill = clarity))+
      geom_bar(position = "identity", alpha = 1/4) #设置透明度
      
    ggplot(diamonds,aes(x=cut, color = clarity))+
      geom_bar(position = "identity", fill=NA) #选择不填充,也就是完全透明,只有边框
    
    #选项2.fill(和堆叠相似,但各组高度相同)方便比较比例
    ggplot(diamonds, aes(x=cut, fill =clarity))+
      geom_bar(position = "fill")
     
    #选项3.dodge(各组条形并列放置)方便比较数值
    ggplot(diamonds, aes(x=cut, fill = clarity))+
      geom_bar(position = "dodge", alpha=1/2)
     
    #选项4.适合散点图的jitter(随机抖动)避免因数据四舍五入而使部分值重叠
    #不加抖动是这样
    ggplot(mpg)+geom_point(aes(x= displ, y = hwy))
    #加了是这样,可以看出数据聚集模式
    ggplot(mpg)+geom_point(aes(x= displ, y = hwy), position = "jitter")
    #快速实现用geom_jitter
    ggplot(mpg)+geom_jitter(aes(x= displ, y = hwy))
    
  8. 作出一条参考线:对角线geom_abline() ;水平geom_hline; 竖直geom_vline

基础工作流

赋值

虽然=也可以,还是推荐使用<- 。因为=后来可能会引起混淆

快速输入<-,用Alt +减号

对象名称

小写字母,_分隔

调取快捷键帮助

alt + shift + K

学习dplyr

五大金刚:
filter()按值筛选观测值;arrange()行重排序;select()按名称选取变量;mutate()使用现有变量创建新变量;summarize()获得摘要
【工作方式:函数(数据框,变量名称+操作) = 》结果返回新数据框】

一种设定:group_by(),可以改变上述函数的作用范围

#先加载参考数据集——航班概况
install.packages("nycflights13")
library(nycflights13)

filter

想同时输出结果并保存在一个变量中,可以这样:
(dec25 <- filter(flights, month == 1, day == 1))
比较数值—浮点数较特殊
> sqrt(2)^2 == 2
[1] FALSE
#计算机使用有限位数运算,因此sqrt(2)^2结果是个近似值,要采用near函数来判断
> near(sqrt(2)^2, 2)
[1] TRUE
逻辑运算
#找到11月或者12月的航班
filter(flights, month == 11| month == 12)
#但是,如果这样写:
filter(flights, month == 11| 12) #结果大不同
# 因为程序先看的是11 | 12,返回逻辑值是TRUE, 而TRUE代表数字1,因此结果就是相当于 filter(flights, month == 1),会找到1月份的航班
NA == NA => NA

NA是什么?=》not available的缺失值

打眼看去,很奇怪的表达,判断NA == NA,怎么结果还是NA?
按现实情况去解释就好理解了:豆豆的年龄未知(dou <- NA),花花的年龄也未知 (hua <- NA),那么豆豆花花的年龄一样吗(dou == hua?),不知道啊,所以还是NA

当然,要判断NA值,用is.na()

filter()默认只保留TRUE的行,排除FALSE、NA,如果要保留NA,例如
filter(df, is.na(x) |x>1 )

简写 %in%

选出x是y中的一个值的所有行

filter(flights, month %in% c(11,12)) #就是上面的简写
简化筛选条件
#如果要找出发或者到达延误时间小于2小时的航班【两种方法】
filter(flights, !(arr_delay >120 | dep_delay > 120))
filter(flights, arr_delay <= 120, dep_delay <=120)
另一个简单的选取数据函数between()

可以用于选取数据范围between(x, left, right)

参数left,right表示数据左边和右边范围,返回结果是逻辑值


欢迎关注我们的公众号~_~  
我们是两个农转生信的小硕,打造生信星球,想让它成为一个不拽术语、通俗易懂的生信知识平台。需要帮助或提出意见请后台留言或发送邮件到Bioplanet520@outlook.com

Welcome to our bioinfoplanet!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容