R语言编程艺术(4)R对数据、文件、字符串以及图形的处理

时间:2023-03-09 09:20:59
R语言编程艺术(4)R对数据、文件、字符串以及图形的处理

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