R 语言简介

2019-03-12 ai language

R 语言作为统计学一门语言,一直属于一个小众的工具集,直到大数据爆发后,越来越多的人开始使用 R 语言进行数据分析。

是一套开源的数据分析解决方案,为统计计算和绘图而生的语言和环境,几行简答的代码就可以实现很复杂的功能。

简介

R 语言最初由 Ross Ihaka 和 Robert Gentleman 在新西兰奥克兰大学统计系设计开发,于 1993 年首次对外公开发布。

安装

最简单的方式是直接安装已经编译好的二进制包。

Windows

关于 Windows R 的安装,关键有三个对象:

安装完 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) 的语言,所有东西都作为一个对象,包括了向量、函数、图形等等,面向对象的编程也基于此。

对象中包含了很多属性,最重要或者最基本的有 ModeClass ,前者表示对象在内存中是如何存储的 (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 官网查看。