R语言入门
最近在复习python的科学计算,突然心血来潮,想看看R的数据处理和python的区别在哪,所以就有了这篇文章。
R语言简介
四十多年前, R 语言的始祖诞生了 , John Chambers 在贝尔实验室中开发出S语言 ,用于快速地进行数据探索, 统计分析和可视化 。十几年后 , 新西兰奥克兰大学的 Robert Gentleman 和 Ross Ihaka 在 S 语言的基础上发明了 R 语言 。
R 语言流淌着统计学的血液 , 它内置了海量的统计函数 ,使用者可以利用其对数据进行快速交互分析 。 同时作为一门图灵完备的解释性语言 , R 的使用者比 SAS , SPSS 等统计软件的使用者拥有了更大程度的自由。
进入 21 世纪后 ,由于个人计算机的普及和统计学科的发展 , R 社群得以进一步发展 , 一些富有想象力的优秀工具涌现出来 。 如果把 R 语言比作一辆车的话 , Rstudio 的出现使得我们有了信息更加丰富的仪表盘 , dplyr , data.table 等等数据处理的包加强了引擎 , ggplot , shiny 等等可视化的工具使得车的外型更好看。
与大多用于工程实践的编程语言相比 , R 语言更像是一个灵巧的研究工具 ,在处理大量数据 , 性能方面比较薄弱。但是与其他工具交互就能漂亮地解决问题 , 例如与 Spark 配合 (sparkR) 解决数据量较大的情况 , 与 C++(Rcpp) 配合可以解决性能不足的问题。
早在五十多年前 , John Tukey 就在论文 "The Future of Data Analysis"[1] 中发表了这样的看法:统计学不应该只是关于统计推断的数学理论,而应该和现实世界联系起来,成为一种“科学”。为了实现这样的目标,需要有收集和整理数据、分析和解释数据的技术,并且把实践当成检验理论的标准。
R语言及其生态作为连接现实世界中的数据和数学模型的桥梁,正在社群的努力下一步一步地把这些想法具体化。
让我们进入 R 语言的世界!
R语言的安装
ubuntu下安装
1、直接到官网上下载安装包(tar.gz),然后依次安装即可。
2、在网速可以的情况下,利用在apt-get安装是一种更为方便的方式:
sudo apt-get update
sudo apt-get install r-base
sudo apt-get install r-base-dev
MAC下安装
mac安装更简单
下载R安装包,完成后点安装。
R语言基本数据结构
下面用 R 的解释器来熟悉一下 R 语言的基本数据结构。
首先让我们先进入 R 环境下
我是在mac操作环境下的,ubuntu的是一样的。
youdi@liangchangyoudeMacBook-Pro ~ R
R version 3.4.1 (2017-06-30) -- "Single Candle"
Copyright (C) 2017 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin15.6.0 (64-bit)
R是自由软件,不带任何担保。
在某些条件下你可以将其自由散布。
用'license()'或'licence()'来看散布的详细条件。
R是个合作计划,有许多人为之做出了贡献.
用'contributors()'来看合作者的详细情况
用'citation()'会告诉你如何在出版物中正确地引用R或R程序包。
用'demo()'来看一些示范程序,用'help()'来阅读在线帮助文件,或
用'help.start()'通过HTML浏览器来看帮助文件。
用'q()'退出R.
>
>
向量
向量是 R 语言中最基本的数据类型,在 R 中没有单独的标量(例如 1 本质上是 c(1)) 。
赋值
R 中可以用 = 或者 <- 来进行赋值 , <-的快捷键是 alt + - 。
> a <- c(4,5,6)
> a
[1] 4 5 6
筛选
我们可以用下标来筛选,例如
> a[1:2]
[1] 4 5
> a[3]
[1] 6
注意 R 语言的下标是从 1 开始的。
当然我们也可以用逻辑进行筛选,例如
> a[a>4]
[1] 5 6
> a[a>5]
[1] 6
为了了解这个式子的原理,我们先看看 a>4 是什么
> a>4
[1] FALSE TRUE TRUE
我们可以看到这是一个布尔值构成的向量,我们在用这个布尔值
做下标时只会选出答案为 TRUE 的值。
另外,负数下标表示不选这个这些下标,例如:
> a[-1]
[1] 5 6
> a[-2]
[1] 4 6
> a[-3]
[1] 4 5
> a[-4]
[1] 4 5 6
合并向量
c() 可以合并向量,例如
> c(a[1] , 3 , a[2:3] , 1)
[1] 4 3 5 6 1
循环补齐
向量有个比较有趣的性质,当两个向量进行操作时,如果长度不等,
长度比较短的一个会复制自己直到自己和长的一样长。
> b
[1] 1 2 3 4 5 6 7 8
> a
[1] 4 5 6
> a + b
[1] 5 7 9 8 10 12 11 13
Warning message:
In a + b : 长的对象长度不是短的对象长度的整倍数
> b <- c(1,2,3,4,5,6,7,8,9)
> a + b
[1] 5 7 9 8 10 12 11 13 15
> length(b)
[1] 9
> which.max(b)
[1] 9
> which.min(b)
[1] 1
不懂就使用help()
查看命令手册
矩阵
矩阵,从本质上来说就是多维的向量,我们来看一看
我们如何新建一个矩阵。
> a <- matrix(c(1,2,3,4,5,6,7,8,9), nrow=3)
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
matrix有很多参数
help(matrix)
Usage:
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
dimnames = NULL)
as.matrix(x, ...)
## S3 method for class 'data.frame'
as.matrix(x, rownames.force = NA, ...)
is.matrix(x)
筛选矩阵
与向量相似,我们可以用下标来筛选矩阵,
例如:
> a[1, 2:3]
[1] 4 7
可以看到结果退化成了一个向量
线性代数
当我们对两个矩阵相乘,我们得到的结果是
对应元素两两相乘的结果,例如
> a
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> a * a
[,1] [,2] [,3]
[1,] 1 16 49
[2,] 4 25 64
[3,] 9 36 81
而这不是我们想要的矩阵乘法,在 R 中我们在乘法旁边加两个
百分号来做矩阵乘法:
> a%*%a
[,1] [,2] [,3]
[1,] 30 66 102
[2,] 36 81 126
[3,] 42 96 150
此外,我们可以用 t() 来求矩阵的转置 , 用 solve() 来求矩阵的逆。
数据框
数据框类似矩阵,与矩阵不同的是,数据框可以有不同的数据类型。
一般做数据分析,我们把一个类似 excel 的表格读入 R ,默认的格式
就是数据框 , 可见数据框是一个非常重要的数据结构。
一般来说我们需要分析的数据,每一行代表一个样本,每一列代表一个
变量。
下面我们用 R 内置的数据集 iris 来看一看数据框的使用。
> data("iris")
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> tail(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
145 6.7 3.3 5.7 2.5 virginica
146 6.7 3.0 5.2 2.3 virginica
147 6.3 2.5 5.0 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
> tail(iris, 20)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
131 7.4 2.8 6.1 1.9 virginica
132 7.9 3.8 6.4 2.0 virginica
133 6.4 2.8 5.6 2.2 virginica
134 6.3 2.8 5.1 1.5 virginica
135 6.1 2.6 5.6 1.4 virginica
136 7.7 3.0 6.1 2.3 virginica
137 6.3 3.4 5.6 2.4 virginica
138 6.4 3.1 5.5 1.8 virginica
139 6.0 3.0 4.8 1.8 virginica
140 6.9 3.1 5.4 2.1 virginica
141 6.7 3.1 5.6 2.4 virginica
142 6.9 3.1 5.1 2.3 virginica
143 5.8 2.7 5.1 1.9 virginica
144 6.8 3.2 5.9 2.3 virginica
145 6.7 3.3 5.7 2.5 virginica
146 6.7 3.0 5.2 2.3 virginica
147 6.3 2.5 5.0 1.9 virginica
148 6.5 3.0 5.2 2.0 virginica
149 6.2 3.4 5.4 2.3 virginica
150 5.9 3.0 5.1 1.8 virginica
我们用 data 函数调入了 iris 这个数据集 , 然后用 head 函数来看一看这个数据
的前几行 , tail 函数来看一看这个数据
的后几行 可以看到有 sepal 的长度,宽度,petal 的长度和宽度,还有一个变量
Species 来描述样本的类别。
我们可以用 summary 函数来对数据集做大致的了解:
> sum
sum summary.Date summary.POSIXlt summary.connection summary.default summary.glm summary.manova summary.proc_time summary.srcref summary.table
summary summary.POSIXct summary.aov summary.data.frame summary.factor summary.lm summary.matrix summary.srcfile summary.stepfun summaryRprof
> summary(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
Median :5.800 Median :3.000 Median :4.350 Median :1.300
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
Species
setosa :50
versicolor:50
virginica :50
可以直观地看到每个变量的信息,对于几个数值变量,我们可以看到最小值,中位数等等统计信息。而对于 Species 这个分类变量,我们看到的是计数信息。
筛选数据框与矩阵相似,都可以通过数字下标来获取子集,不同地是因为数据框有不同的列名,我们也可以通过列名来获取某一特定列,例如
> iris$Species
[1] setosa setosa setosa setosa setosa setosa
[7] setosa setosa setosa setosa setosa setosa
[13] setosa setosa setosa setosa setosa setosa
[19] setosa setosa setosa setosa setosa setosa
[25] setosa setosa setosa setosa setosa setosa
[31] setosa setosa setosa setosa setosa setosa
[37] setosa setosa setosa setosa setosa setosa
[43] setosa setosa setosa setosa setosa setosa
[49] setosa setosa versicolor versicolor versicolor versicolor
[55] versicolor versicolor versicolor versicolor versicolor versicolor
[61] versicolor versicolor versicolor versicolor versicolor versicolor
[67] versicolor versicolor versicolor versicolor versicolor versicolor
[73] versicolor versicolor versicolor versicolor versicolor versicolor
[79] versicolor versicolor versicolor versicolor versicolor versicolor
[85] versicolor versicolor versicolor versicolor versicolor versicolor
[91] versicolor versicolor versicolor versicolor versicolor versicolor
[97] versicolor versicolor versicolor versicolor virginica virginica
[103] virginica virginica virginica virginica virginica virginica
[109] virginica virginica virginica virginica virginica virginica
[115] virginica virginica virginica virginica virginica virginica
[121] virginica virginica virginica virginica virginica virginica
[127] virginica virginica virginica virginica virginica virginica
[133] virginica virginica virginica virginica virginica virginica
[139] virginica virginica virginica virginica virginica virginica
[145] virginica virginica virginica virginica virginica virginica
Levels: setosa versicolor virginica
我们可以用 names() 函数来获取数据框的列名:
> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
并可以通过为其赋值改变列的名字。
列表
列表是一种递归式的向量,我们可以用列表来存储不同类型的数据,比如
> l <- list(name="youdi" , height=176 , weight = 67, man = TRUE)
> l
$name
[1] "youdi"
$height
[1] 176
$weight
[1] 67
$man
[1] TRUE
列表有多种索引方式,可以用如下方式获取。
> l$name
[1] "youdi"
> l$height
[1] 176
> l$man
[1] TRUE
> l[1]
$name
[1] "youdi"
> l[[2]]
[1] 176
> l[['man']]
[1] TRUE
上面的内容涵盖了 R 语言最基本的数据结构.
R 语言学习优秀资源
网络资源
DataCamp : 一个提供云端R语言解释器的网站 ,提供了多门与数据科学有关的课程,可以借助此网站快速上手。
统计之都 : 国内质量最高的统计网站,有一些关于统计和R语言的优秀博客以及与R有关的会议通知。
肖凯博客(需翻墙): 很有质感的博客,有大量 R 语言应用的案例。
数据科学相关书籍
R for data science : 由 Hadley Wickham 合作编写的 2017 年出版的书籍 ,主要介绍的 tidyverse 生态 , tidyverse 中包括了 dplyr(用于数据处理) , ggplot(用于画图)等包,大幅增强了 R 语言的表现力 , 有免费的在线版本。
R 语言实战 : 一本从统计角度介绍 R 语言的书籍 ,较为简单 , 适合快速翻阅。
An Introduction to Statistical Learning : 斯坦福统计系几位教授出版的统计学习书籍,对统计学习进行了清晰细致的讲解 , 书有开源版本 ,并且在Stanford Lagunita上有配套课程
Machine Learning For Hackers : 使用机器学习解决问题的一本书 , 有很多有趣的案例 。