R 语言作为统计学一门语言,一直属于一个小众的工具集,直到大数据爆发后,越来越多的人开始使用 R 语言进行数据分析。
是一套开源的数据分析解决方案,为统计计算和绘图而生的语言和环境,几行简答的代码就可以实现很复杂的功能。
简介
R 语言最初由 Ross Ihaka 和 Robert Gentleman 在新西兰奥克兰大学统计系设计开发,于 1993 年首次对外公开发布。
安装
最简单的方式是直接安装已经编译好的二进制包。
Windows
关于 Windows R 的安装,关键有三个对象:
- 基本运行 R 环境,可以从 CRAN tsinghua mirrors 中选择版本下载。
- 可选 RStudio 一个编辑环境,可以从 www.rstudio.com 下载免费版本。
安装完 R 环境之后可以直接启动一个操作终端,可以不安装 RStudio 。
Linux
R 是通过 C 语言编写的,可以通过源码安装,也可以直接从 CRAN Mirrors 安装已经编译好的二进制包。
# yum install readline-devel
# yum install libXt-devel
# mkdir -p /opt/R
$ ./configure --prefix=/opt/R --enable-R-shlib
$ make
# make install
对于 CentOS 来说,需要安装 EPEL Repositories 仓库源,然后通过 yum install R
进行安装。
最后直接通过 R
命令启动即可。
基本概念
R 是一种基于对象 (Object) 的语言,所有东西都作为一个对象,包括了向量、函数、图形等等,面向对象的编程也基于此。
对象中包含了很多属性,最重要或者最基本的有 Mode
和 Class
,前者表示对象在内存中是如何存储的 (numeric character list function) ,后者表示对象的抽象类型。
其中最基本的类有:数值 (numeric)、逻辑 (logical)、字符 (character)、列表 (list),以及在此基础上构成了一些复杂的类,例如矩阵 (matrix)、数组 (array)、因子 (factor)、数据框 (dataframe)。
用户还可以自定义新类,但所有的类都是建立在这些基本的类之上,可以通过 class()
mode()
typeof()
查看相关的属性。
> f <- data.frame(v = c(1, 2))
> class(f) # 对象的类
[1] "data.frame"
> mode(f) # 实际的存储类型
[1] "list"
> typeof(f)
[1] "list"
因为 R 是从 S 发展而来的,其中 mode()
是为了兼容 S ,相比来说 typeof()
是更新一种形式;而 class()
和前两者不是一套系统,它涉及到 R 语言的面向对象,返回的是该对象的类属性。
示例
----- 帮助相关
> help(solve) # 查看帮助信息
> ?solve # 同上
> help.start() # 启动一个WEB服务器,感觉终端下不太好用
> example(solve) # 查看示例
----- 变量赋值,通过函数c()可以将参数组成一个新的向量
> x <- c(14.5, 9.8, 20.8, 4.5)
> c(14.5, 9.8, 20.8, 4.5) -> x
> assign("x", c(14.5, 9.8, 20.8, 4.5))
> 1/x # 将所有的值取倒数
除了其它语言中都有的一些数据类型、操作符之外,还有其特有的,包括:向量、列表、矩阵、数组、因子、数据帧
软件包
也就是函数、编码、样本数据的集合,可以通过如下方式查看使用。
> sessionInfo() # 当前R解析器的版本以及运行平台信息
> .libPaths() # 当前所有软件包路径
> library() # 所有安装的软件包名称,在上述的路径下
> search() # 当前运行环境已经加载的包
可以通过如下方式安装相关的软件包,默认是从 CRAN 仓库中安装,允许在安装时指定路径。
> install.packages("XML", lib="your/path") # 安装时指定路径
> install.packages("XML", repos=c(CRAN="http://mirrors.ustc.edu.cn/CRAN/"))
> installed.packages() # 当前已经安装的软件包
> update.packages("XML") # 升级
如果没有通过 lib
参数指路径,而且对标准目录没有访问权限,会提示创建一个默认的目录,也可以通过 R_LIBS_USER="~/R"
环境变量指定,对于 CentOS 来说会默认加载 /usr/lib64/R/etc/Renviron
指定的路径。
启动时会加载一系列的配置文件,包括执行一些系统脚本,可以通过
help(Startup)
命令查看详细信息。
另外,包路径也可以通过 R_LIBS
环境变量进行设置,或者在解析器中通过 .libPaths("path/to/your/lib")
命令指定。
或者通过 library("package_name", lib.loc = "path/to/your/lib")
在加载时指定包的路径。
列表
列表是一种比较特殊的对象集合,其中的元素可以是任意类型,而且类型不必相同,它的元素可以由序号访问。
student <- list(name="foobar", age=30, scores=c(85, 76, 90))
student # 查看所有
student[1] # 访问第一个元素
student$name # 访问name元素
student$age <- 40 # 修改年龄
函数
使用关键字 function
来创建一个 R 函数,其定义的基本语法如下:
function_name <- function(arg1, arg2, ...) {
# function body, some statements
return(object)
}
如下是自定义的函数,可以有参数,也可以为空,可以设置参数的默认值。
foobar <- function(a, b = 10) {
print(a + b)
}
foobar(1)
foobar(1, 10)
foobar(a = 1)
foobar(a = 1, b = 10)
上述的几个函数的调用结果相同。
另外,需要注意,函数的参数如果有错误,只有在使用时才会报错,例如:
foobar <- function(a, b) {
print(a + b)
}
foobar(1)
会报 Error in foobar(1) : argument "b" is missing, with no default
的错误。
sample
这也是最常用的随机抽样功能,默认使用的是不放回抽样,也可以通过参数设置为放回抽样。
> sample(x=1:10) # 非放回抽样,抽样10次
> sample(x=1:100, size=10) # 非放回抽样,100个样本,抽样10次
> sample(x=1:100, size=10, replace=T) # 放回抽样
注意,默认的入参顺序是 (x, size, replace)
,如果实际的入参顺序相同,那么实际上可以直接使用,例如 sample(1:100, 10)
。
对于 x
参数来说,可以是数值 (含浮点数),也可以是字符串,例如掷骰子、抛硬币,实际上就属于放回抽样。抛硬币可以使用如下示例:
> sample(x=c("H", "T"), size=10, replace=T)
另外,对于某些二项分布来说,实际抽样的概率未必相等,那么这时就可以使用 prob
参数,这时 probability 的缩写。示例如下:
> sample(x=c("H", "T"), size=10, replace=T, prob=c(0.8,0.2))
在 prob 参数中,所有元素的概率加起来不需要等于 1 ,它只代表某元素被抽取的概率而已。
统计示例
详细可以通过 help(Distributions)
命令查看。
基本统计值
简单来说就是如何求平均值、中位数等。
平均值
取数值的总和并除以数据序列中的值的数量,可以通过函数 mean()
来计算平均值。
mean(x, trim = 0, na.rm = FALSE, ...)
使用参数如下:
x
输入向量。trim
范围是0~0.5
排序之后从两端删除N%
的数据,类似于去除部分最大最小值。na.rm
Bool 值,是否删除缺少的值。
> print(mean(c(8, 1, 3, 2, 5, 6, 7, 9, 4, 17)))
[1] 6.2
如下示例,会先将向量中的值排序 1 3 4 5 8 9 10
,当 trim = 0.1
时从每一端删除 10%
的值,也就是各删除 1 个值,然后再计算均值。
> print(mean(c(8, 1, 3, 2, 5, 6, 7, 9, 4, 17), trim = 0.1))
[1] 5.5
如果缺少值,也就是向量中含有 NA
默认会返回 NA
,此时可以通过 na.rm = TRUE
将缺少的值删除。
> print(mean(c(8, 1, 3, 2, 5, 6, 7, 9, 4, 17, NA)))
[1] NA
> print(mean(c(8, 1, 3, 2, 5, 6, 7, 9, 4, 17, NA), na.rm = TRUE))
[1] 6.2
中位数
数据系列中的中间值被称为中位数,如果是偶数个,则会将中间的两个值相加除 2 ,可以通过 median()
函数来计算中位数。
其语法为 median(x, na.rm = FALSE)
,其中 na.rm
参数与上类似。
> print(median(c(1, 3, 2, 4)))
线性回归
最简单的回归分析,在 R 中可以直接使用 lm()
函数进行模拟,第一个参数 formula
定义了模型参数,实际上就是 X
Y
对应的向量值。
如下是简单的使用方法。
> x <- c(0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.21, 0.23)
> y <- c(42.0, 43.5, 45.0, 45.5, 45.0, 47.5, 49, 53, 50, 55, 55, 60)
> plot(y~x)
> model <- lm(y~x)
> summary(model) # 下面是输出的分析
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-2.0431 -0.7056 0.1694 0.6633 2.2653
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 28.493 1.580 18.04 5.88e-09 ***
x 130.835 9.683 13.51 9.50e-08 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.319 on 10 degrees of freedom
Multiple R-squared: 0.9481, Adjusted R-squared: 0.9429
F-statistic: 182.6 on 1 and 10 DF, p-value: 9.505e-08
然后可以通过如下方式进行预测。
> new <- data.frame(x = 0.16) # 这里的输入数据必须是frame类型
> predict(model, newdata = new, interval = "prediction", level = 0.95) # level 指定预测的置信区间
参考
详细的内容可以直接从 The R Project for Statistical Computing 官网查看。