R语言第二课

更新时间:2023-10-14 07:00:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

读写数据文件

1 读纯文本文件:read.table(), scan() read.table()读取表格形式的

通常形式read.table(file, header=FALSE, sep=””,...)

file所读的文件名,header数据表头,默认FALSE(有表头),sep数据分割符,通常为空格.

rt<-read.table(\ ############返回值为数据框 rt class(rt)

rt<-read.table(\

######如果数据文件没有序号,所读的第一行为表头 scan()读纯文本文件,返回一向量, 返回值可以是数值型、字符型、逻辑型、列表等。 w<-scan(\z<-scan(\

######## h_w.data数据中有不同的属性,共10列, ###### 1,3,5,7,9为长度,2,4,6,8,10为重量。inp<-scan(\

######将数据读出,并以列表的方式赋给变量inp,其中height ######和weight为列表inp的元素名称。

x<-scan() ##########不给函数名,则直接从屏幕读数据

1

2 读取其他软件格式的数据文件

这些软件有:SPSS, SAS, S-PLUS, Stata,调用foreign程序包,包含所需的函数

x<-read.spss(\ #######(SPSS软件)返回列表 x

read.spss(\

#########返回数据框

read.xport(\ #######(SAS软件)返回数据框 read.S(\ #########(S-PLUS软件)返回数据框 read.dta(\ ########(Stata软件)返回数据框

调用foreign程序包步骤:

2

一步(选择“程序包”—>加载程序包)

二步(选择“foreign”) 3 读取Excel表格数据

如果没有下载“RODBC”程序包,R无法直接读Excel格式(.xls)文件,需要转换成其他格式,然后读出。

1)将Excel文件转换成文本文件(.txt):将“educ_scores.xls”(Excel格式)文件打开,然后选另存为——“文本文件(制表符分隔)”,

3

即存为“educ_scores.txt”文件,见图:

调用read.delim( )读取

z<-read.delim(\返回值为数据框 z

当所读数据文件无表头(列名)时,选择

read.delim(\,header=FALSE) ,返回值将自动增加V1,V2,...作为数据的表头。

2)将Excel文件转换成”CSV(逗号分隔)”文件:将

“educ_scores.xls”(Excel格式)文件打开,然后选另存为——“CSV(逗号分隔)”,即存为“educ_scores.csv”文件,见图:

4

调用read.csv( )读取

read.csv(\ #############返回值为数据框 3 直接读取Excel数据表

需下载“RODBC”程序包,在R工作窗口,打开“程序包--->加载程序包---->RODBC”或用library(RODBC)命令,如图1

图1

5

........................................................完......................................... 控制流

将R语言操作过的命令编写成程序存在R的脚本文件里保存起来。R语句之间用分号隔开,若干个语句组成复合语句用花括号{ }。

1 分支函数:if/else和switch if/else多用于两分支:

if (cond) expr ########如果条件cond成立,则执行表 ########达式expr,否则跳过

if (cond) cons.expr else alt.expr #########如果条件cond成立,

######则执行表达式cons.expr,否则执行表达式alt.expr if (any(x<=0)) y<-log(1+x) else y<-log(x)

y<-if (any(x<=0)) log(1+x) else log(x) ######等价 if/else可以嵌套使用: If (con_1) expr_1 else if (con_2) expr_2 else if (con_3) expr_3

11

else expr_4

2 switch函数:多用于多个分支

switch(expr, list),参数expr为表达式,list为列表,如果expr的取值在1~length(list)之间,则函数返回列表相应位置的值,如果expr的取值超出范围,则无返回值: switch(1,2+3,2*3,2/3) switch(2,2+3,2*3,2/3) switch(3,2+3,2*3,2/3)

如果list有元素名,当expr等于元素名时,返回变量名对应的值,否则无返回值: y<- \

switch(y,fruit= \ \ \

3 中止语句与空语句

中止语句Break:强行中止循环,使程序调到循环以外, 空语句next:表示继续执行,而不执行任何有实质性的内容。

4 循环函数

for, while, 和repeat

1) for循环: for(var in seq) expr

12

参数var为循环变量,seq为向量表达式(通常是个序列,如:1:20), expr通常为一组表达式: C x

2) while函数:while (cond) expr, 表示当条件cond成立,则执行表达式expr。 f<-c(1,1);i<-1

while(f[i]+f[i+1]<1000) { f[i+2]<- f[i]+f[i+1] i<-i+1; } f

3) repeat函数 格式:repeat expr

repeat函数依赖中止语句(break)跳出循环,如实现上面同样功能:

f<-c(1,1);i<-1 repeat {

f[i+2]<- f[i]+f[i+1] i<-i+1

if (f[i]+f[i+1]>=1000) break

13

} f

或者改为: f<-c(1,1);i<-1 repeat {

f[i+2]<- f[i]+f[i+1] i<-i+1

if (f[i]+f[i+1]<1000) next else break } f

………………………….完……………………………

R程序设计 1 函数定义

定义函数的格式:funname<-function(arg_1,arg_2,…)

expression

####funname为函数名,function定义函数的关键词,arg_1,arg_2,…表示函数的参数,expression为表达式(通常是复合表达式),放在表达式中最后的对象(数值、向量、矩阵、数组或数据框等)为函数的返回值。

调用函数的格式: function(expr_1,expr_2,…) 注意:(1)不要在R的操作窗口下编写函数;

14

(2)在使用时,须将函数调到R中“文件-〉运行R脚本文件”,选择需要运行包含该函数的脚本,如:将其保存为 funname.R, 则运行该脚本即可使用funname函数了。

2 无参数函数 welcome<-function() print(\

######将其保存为welcome.R,运行该脚本即可使用welcome函数 3 带有参数的函数

var(x) 函数表示求向量x的方差,即 var(x)=sum((x-mean(x))^2)/(length(x)-1) sd(x) 函数表示求向量x的标准差,即sd(x)=

编写函数练习:如果X和Y分别是来自两个总体的样本, 总体的方差相同且未知,编写一个计算两样本统计量T的 函数,统计量T的公式为:

和分别代表来自两组数据样本的均值,别为两组数据样本的方差,和的个数。

15

和分

分别为两组数据样本

t. stat <-function(x,y) {

n1<-length(x);n2<-length(y) X<-mean(x); Y<-mean(y) S1<-var(x); S2<-var(y)

S<-((n1-1)* S1+(n2-1)* S2)/( n1+n2-2) (X-Y)/sqrt(S*(1/n1+1/n2)) }

调用函数练习 例 已知两数据样本A和B,(见程序名exam0103.R), 或文本文件t1.txt(样本A数据)和t2.txt(样本B数据),计算量样本的统计量T。 解:或者按照exam0103.R程序执行(方法一); 或者在R操作窗口输入(方法二):

x<-scan(\ ##见第1页 执行结果:3.472245

注意:编写完的函数先运行一遍,才能调用它。 ........................................................完......................................... 有名参数与默认参数

1) 使用“name=object”的形式给出被调用函数中的参数名, 如name=t.stat,则这些参数可以按照任何顺序给出,如前面计算统计量,下面3种方法计算结果均相同: X<-scan(\

16

X<-scan(\X<-scan(\

2)编写R时可以采用默认参数,当函数被调用时,不输入参数系统自动选择默认参数: 定义计算样本的原点矩函数: moment<-function(x, k, mean=0)

########## mean为样本均值,默认值为0 sum((x-mean)^k)/length(x) ########计算样本的k阶原点矩

调用函数:

source(\

#####如果还没运行该函数,就用此代码调用它 X<-scan(\ moment(X,k=2)

#######也可在命令窗口中 直接输入 [1] 6403.324 ######结果

X<-scan(\ moment(X,k=2,mean=mean(X)) #######计算样本的中心矩 [1] 0.0005301775 ######结果

######注意:代码中的引号、括号、逗号都必须在R操作窗口 ######中打出的,或在英文下打出的,如在中文下打出的,R操

17

######作窗口不认。

递归函数: 可在函数自身内定义函数. 如计算n! (在文件factorial1.R里): fac = function(n) { f <- 1 if (n>0){ for(i in 1:n) f <- f * i } f }

上面的也可以用递归方法编写(在文件factorial2.R里): fac = function(n)

if (n <= 1) 1 else n * fac(n - 1)

调用函数:

source(\factorial1.R\n<-29 fac(n)

[1] 8.841762e+30 ######结果 source(\factorial2.R\

18

n<-29 fac(n)

[1] 8.841762e+30 ######结果一样 程序运行

1 建立自己的工作目录

可以用setwd(\选择自己设的工作目录\或“文件->改变工作目录”,如下图3

图3

双击“改变工作目录”,弹出“浏览文件夹窗口”,选择目录,按“确定”即可,在第一次退出时,保存工作空间,则子目录出现大个蓝色R的文件(后缀为.RData),以后再运行R时,双击这个蓝色R文件,所在的目录就是当前工作目录。

当保存脚本后,运行它,可把它打开,选择“编辑—>运行所有代码”,及运行了该文件。 2 工作空间

3 作用域:工作空间的变量为全局的,函数中的变量为局部的。 4 程序包:R系统中的自带函数,由各个程序包定义,可用search()

19

函数查看当前的程序包: > search() \

\

\

\ \ \\ \ \ 这9个是基本的程序包.

如果想知道程序包中包含了哪些函数,可用library ()函数,如library (help=\查看base中的函数。

给自定义的函数起名,最好与R系统中的函数名不要同名,若同名,可用包的名称加::调用R系统中的函数,如:base::t().

………………………………………..完………………………………………….

数值计算练习 一 矩阵运算:

1矩阵相乘: A %*% B表示两矩阵相乘(AB): 用%*% 符号 A<-matrix(1:9,nrow=3,byrow=T);A B<-matrix(1:9,nrow=3);B

C<-A %*% B ####表示两矩阵相乘 C

x<-1:3

A %*% x ####表示矩阵和向量相乘 x %*% A

2 矩阵转置: t( )为矩阵转置函数, AT 表示为t(A) A<-matrix(1:9,nrow=3,byrow=T);A t(A)

20

3 求矩阵行列式值:det( )

A<-matrix(c(1:8,0),nrow=3,ncol=3);A det(A)

[1] 27 ###结果

4 生成对角阵和对角运算

diag( ): v是一个向量时,diag(v)表示以v的元素为对角线的对角阵,M是一个矩阵时,diag(M)表示取M的对角线上的元素构成的向量 v<-c(1,4,5) diag(v)

M<-array(1:9,dim=c(3,3));M diag(M)

5矩阵范数norm( ):

norm(x, type = c(\

参数x为矩阵,type为字符串,表示计算范数的类型,\范数,\范数,

\为无穷大范数,等。 A<-matrix(c(1,3,2,4),ncol=2) norm(A)

[1] 6 ###结果

二 求解线性方程组

solve(a, b, tol, LINPACK = FALSE, ...)

参数a为方阵,b为向量或矩阵,默认值为单位矩阵,tol为精度要求,当小于精度时,认为矩阵a的各列线性相关,LINPACK为逻辑变量,判断是否使用LINPACK

包,默认值为FALSE.

例 求解线性方程组 AX=b,

,

A<- matrix(c(1:8,0),nrow=3,byrow=TRUE);b<-c(1,1,1)

x<-solve(A,b);x

三 非线性方程求根:uniroot( ) uniroot(f, interval, ...,

lower = min(interval), upper = max(interval), f.lower = f(lower, ...), f.upper = f(upper, ...),

extendInt = c(\ tol = .Machine$double.eps^0.25, maxiter = 1000, trace = 0)

参数f为需求根的函数,interval为包含方程根的初始区间,lower和upper分别为搜索区间的左右端点,默认值分别为interval的最小和最大,分别为左右端点的函数值,默认值由函数计算得到,tol为精度要求,maxiter最大迭代次数,默认值为1000。

例 求解非线性方程:x3-x-1=0 的根,初始区间为[1,2]. f<-function(x) x^3-x-1

uniroot(f,c(1,2)) ####等价:uniroot(f,lower=1,upper=2)

21

polyroot( )函数专为求多项式根: 格式:polyroot( z )

参数z为n维向量,是n-1阶多项式的系数: P(x)=z1+z2x+…+znxn-1

例:求多项式x3-x-1=0的全部根。 polyroot( c(-1,-1,0,1))

[1] -0.662359+0.5622795i -0.662359-0.5622795i 1.324718+0.0000000i ##结果

四. 求函数极值

1求一元函数极值 optimize( )或optimise( ) 格式:

optimize(f = , interval = , ..., lower = min(interval), upper = max(interval), maximum = FALSE, tol = .Machine$double.eps^0.25)

optimise(f = , interval = , ..., lower = min(interval), upper = max(interval), maximum = FALSE, tol = .Machine$double.eps^0.25)

参数f为求极值的函数,interval为向量,表示初始区间,…提供目标函数f的附加参数,lower 和upper分别表示搜索极值的左右端点,默认值由参数interval提供,maximum为逻辑变量,取值为FALSE(默认值)表示求极小, 为TRUE表示求极大,tol为精度要求。返回值为列表,有极小点(minimum)和目标函数值(objective)。

3

例 求一元函数f(x)=x-2x-3在区间[0,2]上的极小点。 f<-function(x) x^3-2*x-3 optimize(f,lower=0,upper=2)

$minimum ###结果 [1] 0.8164968 $objective [1] -4.088662

目标函数有附加参数: f(x)=(x-a)^2 , a=1/3. f<-function(x,a) (x-a)^2

optimize(f, interval=c(0,1), a=1/3) $minimum ###结果 [1] 0.3333333 $objective [1] 0

2求多元函数极值:nlm( ) 格式:

nlm(f, p, ..., hessian = FALSE, typsize = rep(1, length(p)), fscale = 1, print.level = 0, ndigit = 12, gradtol = 1e-6, stepmax = max(1000 * sqrt(sum((p/typsize)^2)), 1000),

22

steptol = 1e-6, iterlim = 100, check.analyticals = TRUE)

参数f为求极值的目标函数,p为初始参数,…提供目标函数f的附加参数,hessian为逻辑变量,取值为FALSE, 当取TRUE时f中包含梯度,steptol表示步长的

精度要求,iterlim最大迭代次数,默认值100。

函数返回值是一个列表,包含minimum极小值,estimate极小点的估计值,code编码,值为1或2时,表示当前点为最优点,值为3,4,5时表示当前点可能不是最优点,iterations迭代次数。

例 求min f(x)=100(x2-x12)2+(1-x1)2极小点,取初始点x(0)=(-1.2,1)T 解:

obj<-function(x) 100*(x[2]-x[1]^2)^2+(1-x[1])^2 nlm(obj,c(-1.2,1))

$minimum

[1] 3.973766e-12 $estimate

[1] 0.999998 0.999996 $gradient

[1] -6.539281e-07 3.335999e-07 $code [1] 1

$iterations [1] 23

四 数值积分

格式:integrate(f, lower, upper, ..., subdivisions = 100,

rel.tol = .Machine$double.eps^0.25, abs.tol = rel.tol, stop.on.error = TRUE, keep.xy = FALSE, aux = NULL)

参数f为被积函数,lower和 upper分别为积分的下限和上限,积分限可以为Inf(表示),…为被积函数的附加参数,subdivisions表示子区间的最大数目,rel.tol为所需的相对精度,abs.tol为所需的绝对精度,其它参数使用默认值。 例 求积分,积分区间[0,1] 解 f<-function(x) exp(-x^2) integrate(f,0,1)

0.74 68241 with absolute error < 8.3e-15 ###结果

23

本文来源:https://www.bwwdw.com/article/jlmf.html

Top