本文对应《R语言编程艺术》
第8章:数学运算与模拟;
第10章:输入与输出;
第11章:字符串操作;
第12章:绘图
=========================================================================
数学运算与模拟
数学函数:
数学函数 | 说明 |
exp() | 以自然常数e为底的指数函数 |
log() | 自然对数 |
log10() | 以10为底的常用对数 |
sqrt() | 平方根 |
abs() | 绝对值 |
sin(), cos() | 三角函数 |
min(), max() | 向量的最小、最大值 |
which.min(), which.max() | 向量的最小、最大元素的位置索引 |
pmin(), pmax() | 把多个等长度的向量按元素逐个对比,返回所有向量的第k个元素中最小(最大)的值 |
sum(), prod() | 把一个向量的所有元素求和(求积) |
cumsum(), cumprod() | 把一个向量的前K个元素累计求和(求积) |
round(), floor(), ceiling() | 分别是四舍五入取整、向下取整、向上取整 |
factorial() | 阶乘 |
要求函数的最小、最大值,需要用nlm()和optim()
R也可以进行微积分运算,包括符号微分和数值积分:
#符号微分
D(expression(exp(x^2)), “x”)
#数值积分
integrate(function(x) x^2, 0, 1)
R的odesolve包可以用于处理微分方程;ryacas包提供了R与Yacas符号数学系统接口。
统计分布函数:
一般为前缀加统计分布函数名组成具体函数
前缀:
d 概率密度函数或概率质量函数
p 累计分布函数
q 分布的分位数
r 随机数生成函数
排序:
对向量进行普通的数值排序,可以使用sort()函数完成;如果想得到原向量的索引,可以使用order()函数。
相关函数还有rank(),它返回向量中每一个元素的排位(rank,第几小,以小数处理并列排名)
向量和矩阵的线性代数运算:
函数 | 线性代数运算 |
crossprod() | 向量内积 |
solve() | 求解线性方程组或者计算矩阵的逆 |
t() | 矩阵的转置 |
qr() | QR分解 |
chol() | Cholesky分解 |
det() | 矩阵的行列式 |
eigen() | 矩阵的特征值和特征向量 |
diag() | 从方阵中提出对角矩阵 |
sweep() | 数值分析批量运算符 |
diag()函数:如果输入矩阵则返回向量,输入向量则返回矩阵,输入标量则返回相应大小的单位对角矩阵。
集合运算:
集合运算函数 | 说明 |
union(x, y) | 集合x和y的并集 |
intersect(x, y) | 集合x和y的交集 |
setdiff(x, y) | 集合x和y的差集 |
setequal(x, y) | 检验集合x和y是否相等 |
c%in%y | 成员,检验c是否为集合y中的元素 |
choose(n, k) | 从含有n个元素的集合中选取含有k个元素的子集的数目 |
用R做模拟:
为了重复运行时获得相同的随机数流,使用set.seed()函数。
=========================================================================
输入与输出
连接键盘与显示器:
scan()函数、readline()函数、print()函数、cat()函数
scan()函数:从文件中读取或者用键盘输入一个向量,可以是数值型或字符型向量。注意读取时默认变量为double型,如果字符型需要手动设置what = “”(或者任意字符串),否则会报错;默认分割符为“空白字符”(whitespace),同样可以手动设置其他类型;当scan()函数接收的文件名为空时,会从键盘读取数据,命令行在每行行首提示的数字是下一个输入项的索引,键入一个空行表示结束输入,默认报告已读取的项目数,如果不希望得到报告,可以设置quiet = TRUE。
readline()函数:可以从键盘输入单行数据,可以指定一个提示语字符串作为参数。
print()函数:打印对象内容;
cat()函数:也是打印对象内容,但是与print()不同之处在于,不会输出编号,只输出内容;可以灵活自定义输出分隔符。
读写文件:
从文件中读取数据框或矩阵、文本文件的操作、访问远程机器上的文件、读取文件和目录信息。
从文件中读取数据框或矩阵:read.table()函数;
读取文本文件:readLines()函数。
连接的介绍:一般通过调用file()/url()或其他R函数创建,更多函数可在命令行输入?connection查看。用close()函数关闭连接,可以让系统知道你已经完成读取操作,可以正式写入磁盘,在互联网上操作可以告诉服务器客户已下线。
通过URL在远程计算机上访问文件:某些I/O函数,如read.table()和scan(),可以用网站地址(URL)作为参数(替代文件名)在网络上访问文件。
写文件:write.table()函数;cat()函数;writeLines()函数
> #cat()函数可以创建文件u,一次写入一部分,每次写文件都会自动保存
> cat(“abc\n”, file = “u”)
> cat(“de\n”, file = “u”, append = TRUE)
> #file()函数创建文件www并通过设置w建立写入连接
> #writeLines()会将字符串向量分行写入,需要主动关闭连接才能保存文件
> c <- file(“www”, “w”)
> writeLines(c(“abc”, “de”, “f”), c)
> close(c)
获取文件和目录信息:
函数 | 说明 |
file.info() | 参数是表示文件名的字符串向量,函数会给出每个文件的大小、创建时间、是否为目录等信息 |
dir() | 返回一个字符串向量,列出其第一个参数指定的目录中的所有文件的名称。如果指定recursive = TRUE,结果将把第一个参数下面整个目录树都显示出来 |
file.exists() | 返回一个布尔向量,表示作为第一个参数的字符串向量中给定的每个文件名是否存在 |
getwd()/setwd() | 用于确定或改变当前的工作目录 |
命令行输入?files可以查看所有与文件和目录相关的函数
访问互联网:
R的套接字(socket)工具可以让程序员访问互联网(Internet)的TCP/IP协议。
R中的socket:
A在与B的连接期间发送的所有字节被看作是一个整体,称为“长消息”(big message)。将长消息分割回若干行文本需要一些额外的工作,对此问题,以下方法可以达到解决目的:
readLines()和writeLines():这两个函数允许你在写程序时把TCP/IP的消息传输当作是一行一行传递的,尽管这并不是真实情况。如果你要传输的数据本质上就是按行分隔的,那么这两个函数将是非常方便的。
serialize()和unserialize():可以利用这两个函数传输R对象,比如矩阵或者某个统计函数的复杂输出结果。传输对象将在发送端转换成字符串形式,然后在接收端转换回原来的对象形式。
readBin()和writeBin():这两个函数用于传输二进制的数据。
以上每个函数都可以对R中的连接进行操作。
此外R中还有另外两个socket函数:
socketConnection():该函数可以通过socket来创建一个R连接。可以使用参数port来设定端口号,然后将server参数设为TRUE或FALSE来说明需要创建的是服务器还是客户端。如果创建的是客户端,还必须用host参数来设定服务器的IP地址。
socketSelect():该函数在服务器与多个客户端相连接时非常有用。其主要的参数socklist是一系列连接的列表,而返回值是这些连接的一个子列表,其中的元素所表示的连接提供了服务器可以读取的数据。
=========================================================================
字符串操作
常用字符串操作函数:
函数名及调用形式 | 功能 |
grep(pattern, x) | 在字符串向量x里搜索字符串pattern,返回一个长度不超过x的向量,包含了符合条件的索引,如果没有符合条件的pattern,则会返回一个空向量 |
nchar(x) | 返回字符串x的长度 |
paste(…) | 用于把若干个字符串拼接起来 |
sprintf(…) | 按一定格式把若干个组件组合成字符串 |
substr(x, start, stop) | 返回给定字符串x中指定位置范围start:stop上的子字符串 |
strsplit(x, split) | 函数根据x中的字符串split把字符串x拆分成若干子字符串,返回这些字符串组成的R列表 |
regexpr(pattern, text) | 在字符串text中寻找pattern,返回pattern匹配的第一个子字符串的起始字符位置 |
gregexpr(pattern, text) | 在字符串text中寻找pattern,返回pattern匹配的所有子字符串的起始字符位置 |
正则表达式:
正则表达式是一种通配符,用来描述一系列字符串的简略表达式。
例如[au]表示含有字母a或u的字符串,英文句点(.)表示任意一个字符,反斜杠(\)可以使字符脱离元字符属性(元字符:不按照字面意思理解的字符)。具体学习需要参照正则表达式的教程。
注意当通过一些符号作为字符串查找或分割时,出现一些不可预料的错误时,可以考虑是否是正则表达式引入的。
绘图
创建图形:
函数 | 功能 |
plot() | 泛型函数,真正被调用的函数依赖于对象所属的类 |
abline() | 添加线条(根据斜率与纵截距) |
lines() | 添加线条(根据两个截距) |
points() | 添加点 |
legend() | 添加图例 |
text() | 添加文字 |
locator() | 精确定位 |
在保持现有图形的基础上新增一个绘图窗口:
hist(x)
#Linux系统下
x11()
#Mac系统
macintosh()
#Windows系统
windows()
hist(y)
#图形将在一个新窗口打开显示
定制图形:
选项 | 功能 |
cex | 改变字符大小(倍数) |
xlim, ylim | 坐标轴范围 |
函数 | 功能 |
polygon() | 添加多边形 |
lowess()/loess() | 平滑散点 |
绘制具有显式表达式的函数图像:
根据表达式定义函数,描点即可。
实现方式:plot()描出所有点,或者直接使用curve(),参数设置为表达式与起止点即可。
将图形保存到文件:
R图形设备:
可以打开一个文件(如PDF):pdf(“d12.pdf”)
函数 | 功能 |
dev.list() | 查看所有图形设备 |
dev.cur() | 查看当前活动图形设备 |
dev.set() | 设置活动图形设备,参数为dev.list()查询到的设备编号 |
dev.copy() | 将图形拷贝到指定图形设备上,参数为dev.list()查询到的设备编号 |
dev.off() | 关闭图形设备 |
创建三维图形:
R中提供了一系列函数用来绘制三维图形,例如persp()和wireframe()函数可以绘制曲面,cloud()函数可以绘制三维散点图。
#wireframe()函数使用范例
library(lattice)
a <- 1:10
b <- 1:15
eg <- expand.grid(x = a, y = b)
eg$z <- eg$x^2 + eg$x *eg$y
wireframe(z ~ x + y, eg)