本文对应《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)