Communication
Concept & History
Data Acquisition
Machine Learning
Onlinebook
Program
Tidyverse
Website
Visualization
Basic
Collection
Common Plots
Extension
Map
Modification
Theory
Communication
Starting a Rmarkdown Blog with Blogdown + Hugo + Github (181110)
看了好几篇介绍用blogdown搭建博客的文章,只有这一篇文章介绍的方法让我成功了。
Adding GIF animations (190228; 190311)
介绍了在blogdown中添加动图和生成动图的方法。
Create Multiple Reports with RMarkdown (181129; 190311)
使用Rmarkdown批量生成报告的教程,测试有效,非常实用。
MANY REPORTS FROM 1 RMARKDOWN FILE (190311)
另一篇使用Rmarkdown批量生成报告的教程,没有实际测试,但应该没问题。
Happy collaboration with Rmd to docx (181110)
人对事物的认识大概可以分为三个层次,从“未知的未知”到“已知的未知”再到“已知的已知”。如果确实是这样的话,那学习就可以分为两种,一种是把“未知的未知”变为“已知的未知”,如了解到这个世界上存在一种叫做“负数”的东西,但不知道它究竟指什么;另一种是把“已知的未知”变为“已知的已知”,如通过进一步的了解,获知“负数”的确切意义。德尔菲的神谕认为没有人比苏格拉底更聪明,其看重的可能并不在于苏格拉底是否比其他所有人拥有更多“已知的已知”,而是看到他比其他人拥有更多“已知的未知”。我不知道两种学习中哪一种更为重要,但我觉得,在大多数情况下,前一种学习都是后一种学习的先决条件。人的时间是有限的,没法把所有的知识都掌握,所以比较好的学习思路可能是先去获取足够多的“已知的未知”,再决定把哪些“已知的未知”转变为“已知的已知”。
我接触R已经三年多了,但真正开始学习R,也就一年多的样子。我对R本身其实没有多大的兴趣,但当我把tidyverse变为“已知的未知”时,才对这门语言产生了热情。翻开哲学的入门书,很有可能会发现最开始的章节是以苏格拉底来划分的,如类似“前苏格拉底时代的哲学家们”的说法。在这里,我也想用tidyverse这个词来对我的笔记章节进行划分(当然,tidyverse对应的哲学家更有可能是笛卡尔),具体来说,包括tidyverse之前,用来介绍R的一些基本知识;tidyverse之内,用来介绍tidyverse核心包的使用方法;tidyverse之上,用来介绍建立在tidyverse核心包基础上的一些实用的包;tidyverse之外,用来介绍与tidyverse无关,但很有用的一些包。当然,这些内容中的很大一部分对我来说还是“已知的未知”。
想弄这么个东西,目的主要有两个:一方面,把自己会的东西以教程的形式写出来,能让自己把“已知的已知”掌握得更牢固;另一方面,也能督促自己不断地去学习新知识,探索“未知的未知”,转化“已知的未知”。因此,内容方面,就包括我目前会的,和我将来想学的,具体内容可以看后面暂定的大纲。另外,我也给自己设定了几个要求:
术语尽量给出参考资料和对应的英文,不知道该如何翻译的直接用英文,符号给出对应的英文及其读音;
尽量保证所有的内容都能跟上R本体和所涉及的包的更新;
暂定的提纲如下:
tidyverse之前
R的介绍及安装
R的基本概念及操作
R中的条件与循环
tidyveRse之内
使用readr导入数据
使用rvest获取网络数据
dbplyr与数据库
dplyr包常用操作及管道操作符
tidyr包常用操作及tidy data
stringr包常用操作及正则表达式
forcats常用操作
lubridate常用操作
purrr包探索
组合使用
tidyverse代码风格
ggplot2基本统计图的绘制
ggplot2统计图的调整
ggplot2统计图的美化
tidyverse之上
使用tidytext进行文本分析
使用ggvis绘制交互统计图
使用gganimate绘制动态统计图
tidyverse之外
使用rmarkdown撰写报告
使用blogdown搭建博客
使用shiny制作网络应用
R的基本操作
a.计算
b.逻辑运算
c.赋值
R的基本概念
a.数据结构
数据探索
b.函数
c.包
190424
R的基本操作
a.计算
R可以作为计算器使用,+、-、*、/、^分别代表加减乘除和乘方:
2 ^ 2 / 2 - (2 * 2 + 2)
## [1] -4
%%求余数,%/%求商:
5 %% 2
## [1] 1
5 %/% 2
## [1] 2
b.逻辑运算
==、!=、>、>=、<、<=分别用来判断相等、不等、大于、大于等于、小于、小于等于的关系,符合逻辑返回TRUE,反之返回FALSE。对于部分字符(英文字母和汉字),似乎是字母顺序排在后面的更大;对于字符型数值,似乎与其数值型数值相等;另外,逻辑型数值中,TRUE等于1,而FALSE等于0:
TRUE == 1
## [1] TRUE
FALSE == 0
## [1] TRUE
'白马' != '马'
## [1] TRUE
1 == '1'
## [1] TRUE
'x' < 'y'
## [1] TRUE
'一' > '二'
## [1] TRUE
c.
有一次参加了一个特别无聊的讲座,实在是无事可做,就琢磨了一下像微信抢红包那样的机制是如何实现的。自己当时想了一个模拟的方式,出来的结果似乎也可以以假乱真。后来把相关的代码完善了下,用来在自己组织的R语言课上讲for循环和自编函数。现在把这些内容整理出来,权当作一篇小小的教程。
首先假设,有人发了一个200块钱的红包,分给10个人抢:
money <- 200
people <- 10
给每个人安排一个随机数:
set.seed(181209)
rand_number <- sample(1:10000, people, replace = TRUE)
rand_number
## [1] 4188 591 2386 4520 3692 979 8170 3728 7121 4408
随后用每个随机数除以所有随机数的总和得到一个比值,乘以总钱数,进而得到每个人的钱数:
rand_money <- rand_number/sum(rand_number)*money
rand_money
## [1] 21.054219 2.971118 11.995073 22.723274 18.560692 4.921700 41.072820
## [8] 18.741674 35.799211 22.160219
然后就可以知道具体每个人得到多少钱了:
paste0(paste0(sample(letters, 5, replace = TRUE), collapse = ''),
'得到了', round(rand_money[1], 2), '元,红包剩余', round(money - sum(rand_money[1:1]), 2), '元。')
## [1] "hdprm得到了21.
Bar Plot
Box Plot
Heatmap
Histgram
Line Chart
Map
Pie Chart
Radar Chart
Scatter Plot
Treemap
像这样的教程应该有很多了,但为了自己查阅起来方便,我决定自己也写一个。这里我会尽量多的用到各种theme和palette,省得每次绘图还要一个一个试,看哪个好看(通过这个过程,我可能体验到了女生出门前挑衣服的感觉)。
先把需要用到的包载入:
library(tidyverse)
library(ggthemes)
Bar Plot
直条图应该是最常见的了,在心理学论文中用到直条图时,一般都是把自变量放到x轴上,因变量放到y轴上,然后再添加误差条:
iris %>% group_by(Species) %>% summarise(avg_sl = mean(Sepal.Length), se = sqrt(sd(Sepal.Length)/n())) %>% ggplot(aes(Species, avg_sl, fill = Species)) + geom_col(width = .5) + geom_errorbar(aes(ymin = avg_sl - se, ymax = avg_sl + se),width = .3) + scale_y_continuous(expand = c(0, 0)) + scale_fill_brewer(palette = 'Set2') + labs(y = 'Sepal.
大概是去年的这个时间,我在一个名叫Data Is Beautiful的reddit论坛上看到了一张Rick and Morty的分集评分热力图,就想用R把它重复出来。当时水平还不怎么样,只能画个大概出来,很多细节都不知道该如何呈现;前几个月,又重新尝试了下,大部分细节都知道该如何实现了,但还是差一点;这里再尝试一下,看看能不能完全重复出来,毕竟这张图应该就是用R画的。
图是这样的:
首先,还是先把需要用到的包载入:
library(tidyverse)
然后载入数据:
rm <- read_csv("rick & morty.csv") %>% mutate_at(vars(Episode, Season), as.factor)
载入数据的时候,为方便后面的绘图,顺便把集数和季数两个变量改成了因子型。具体的数据是这样的:
rm
## # A tibble: 31 x 3
## Episode Season Rating
## <fct> <fct> <dbl>
## 1 1 1 8.1
## 2 2 1 8.7
## 3 3 1 8.4
## 4 4 1 8.6
## 5 5 1 8.9
## 6 6 1 9 ## 7 7 1 8.