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
正在阅读:
R语言第二课10-14
MMCSD卡驱动程序设计07-25
研究生学术英语课后习题答案03-08
易经64卦读音12-13
白银市事业单位拟聘人员名单03-08
初中英语语法定语从句讲解&练习03-20
初一地理上册教案05-09
初中化学教学中的德育渗透06-04