R 从零开始,简单API集合
1.简单的算数操作和向量运算
命令行启动 R,退出 q(). 可以在退出时保存项目进度,同目录下启动R时可以恢复进度.
获取函数帮助:help(solve) 或者 ?solve ,help.start() 启动html帮助
对于使用某个命令的例子,可以用example(topic)查看
R 大小写敏感, 命令可以被;隔开,可以使用({})构复合表达式,#开始到句尾为注释
如果一批命令保存在commands.R中,可以使用source("commands.R")执行
sink("log.txt")把输出导入到文件中,sink()把输出导回控制台
R创建和控制的实体被称为对象,对象通过名字创建和保存.ls()和objects()用来显示所有对象,rm(object)删除对象
赋值可以使用<-,=或二者->,或者用assign("x",c(1,2,3))来实现。 c()用来构建任意参数形成的向量
y=c(x,0,x)可以形成新向量。1/x可以显示出各个元素的倒数。在算数表达式中用向量会让每个元素都进行向量运算
+-*/ log(),exp(),sin(),cos(),tan(),sqrt(),max(),min(),mean(),sum(),var(计算方差),length().sort(升序)
seq(2,10)等价于2:10. seq有更多参数seq(from=a,to=b,by=c,length=d)参数顺序可变,by为步长.
rep可以重复对象 rep(c(1:3),times=2) 得到(1,2,3,1,2,3), rep(c(1:3),each=2)得到(1,1,2,2,3,3)
逻辑向量:TRUE, FALSE, NA。逻辑运算:<,<=,>,>=,==,!=. &交集运算与,|并集运算或,!非运算
任何含有NA数据的运算结果都是NA,is.na(x)返回一个和x长度相等的向量,x中为NA的位置为TRUE,其余为FALSE
NAN是缺损值如0/0,NA为不可得到值
paste()可以有任意多参数,把他们一个一个连成字符串,如paste(c("x","y"),1:6,sep="")得到("1x","2y","3x","4y","5x","6y")
一个向量的子集可以通过在[]中加入索引向量得到:
1.逻辑向量:此时索引向量需要和逻辑向量长度一致。x[!is.na(x)]取得所有非NA元素作为子集,(x+1)[(!is.na(x)) & x>0] 把x所有元素加1并生成一个不含NA和负数的子集
2.正整数向量。此时和索引向量对应的元素被选中,长度和索引向量一致,如x[1:10].索引向量长度可以比原向量长,如c("x","y")[rep(c(1,2,2,1),times=4)]会生成"x","y","y","x"重复四次的向量
3.负整数向量:指定元素排除,如(x[-(1:5)])排除1-5号元素
4.字符串向量:仅仅用于用name属性来标识元素。如: fruit=c(1,2,3,4);names(fruit)=c("a","b","c","d");num=fruit[c("a","b")]
向量是R里面最重要的,还有其他对象比如矩阵matrix,因子factor,列表list,数据框data frame,函数function.
2.对象以及他们的模式和属性
R中对象的类型包括数值型"numeric",复数型"complex",逻辑型"logical",字符型"character"和原味型"raw"。mode(object) 可以得到对象类型。as.character(z), as.integer(z)可以转换对象类型,class(object)看对象所属的类
使用length(alpha)=3 改变alpha的长度为3. e=numeric(),e为空对象,e[3]=10把e长度扩展为3,前两个元素为NA。
3.有序因子和无序因子
因子(factor)用来储存类别变量和有序变量,这种变量不能用来计算,只能用来分类和计数。例子:
4.数组和矩阵
数组是多个类型相同元素的集合,维度向量是一个正整数向量,若它长度为K则是K维,数组中元素下标可以从1到维度向量中对应元素值
若z是一个含有1500元素的向量dim(z)=c(3,5,100)把z变为三维3*5*100数组,每一维对应长度为3,5,100. matrix()和array()也可以定义数组
数组的排列次序是按列的,第一下标变化最快,最后下标变化慢。若维度向量为a(3,2),则6个元素依次为a[1,1],a[2,1],a[3,1],a[1,2],a[2,2],a[3,2]
数组分隔可以通过在下标处给定索引向量实现,如a[1,]代表a[1,1]和a[1,2];用dim(z)可以显式访问维度向量
索引数组:可以根据索引数组给数组中不规则的元素集合赋值或者将数组中特定元素返回一个向量中,例子:
通过array构建数组:Z=array(datavector,dimvector),比如z=array(h,dim=c(3,4,2))利用h构建3*4*2的数组,h若小于24则数据循环使用
t()转置数组,nrow(),ncol()返回行数和列数 ,*使矩阵对应元素相乘, %*%是矩阵乘法
求解线性方程组 b=A%*% x,若给出b和A,x就是根,可用slove(A,b)得出x,若要求A的逆,则直接使slove(A)
使用cbind(arg1,arg2...)和rbind(arg1,rag2...)合并矩阵,前者横向合并,后者纵向合并
可以使用vec =as.vector(X) 和vec=c(X)把矩阵X转化为简单向量
5.列表和数据框
列表是一个以对象的集合构成的对象,包含的对象称为分量,分量可以是不懂模式和类型。
Lst=list(name="fred",wify="mary",no.children=3,child,ages=c(4,7,9)).Lst[[1]]可以访问第一个分量,Lst[[4]][1]访问第四个分量的第一个元素
也可以使用Lst$name,Lst$wift这种分量名来访问分量,或者Lst[["name"]],分量可以用下标扩充,Lst[5]=list(matrix=Mat)
可以用连接函数c()连接分量。List.ABC=c(list.A,list.B,list.C)
数据框是属于data.frame类的列表,
6.从文件中读取数据
如果变量主要在数据框操作,建议用read.table(),它读取整个数据框,而且需要外部文件有特定的格式,第一行是各个变量的名字,随后行第一个条目是行编号,其他条目是各个变量值,例如HousePrice = read.table("house.data"),使用参数header=True可以忽略行标签
也可以用scan()读入文件,如inp=scan("input.data",list(a="",b=0,c=0))这样会把inp设为一个列表,列表的三个向量类型分别是字符,数值,数值。为了把他们分为独立的向量,使用以下方式:label=inp[[1]],x=inp[[2]],y=inp[[3]],可以在list中给他们命名(就是abc),这样就可以直接用名字访问,如label=inp$a。
R自带100多个数据集,用data()可以显示可用数据集,访问特定包的数据使用data(package="rpart")。若要修改数据集,可以使用xnew=edit(xold),若要在原数据集上修改使用fix(xold).
8.概率分布
恩。。。复杂的数学,有空再看吧
9.成组,循环和条件控制
R是表达式语言,因为它仅有的命令形式就是返回结果和表达式。命令可以用大括号全在一起,分号分开此时一组命令的结果是最后一个命令的值,组依旧是表达式所以可以放在更大的括弧里。
if语句:if(expr1) expr2 else expr3,&&和||常用语控制语句中,注意&和|作用于向量所有元素而&&和||值作用于长度为1的向量。条件语句有函数的形式,为ifelse(condition,a,b),返回一个和最长参数向量同样长的向量,condition[1]为真时对应元素a[i],否则b[i]。
循环控制有for循环,repeat和while:for(name in expr1) expr2
repeat expr ,while(condition)expr。 break可以结束任何循环,而且是结束repeat循环的唯一办法,next用来结束一次循环
10.编写函数
一个函数通过以下语句定义:name = function(arg1,arg2...) expression
可以定义新的二元操作符: "%!%" = function(X,y){......},注意要使用引号,然后就可以以X%!%y的形式使用了。
调用参数是如果使用参数名,则参数位置可以任意,如fun1=function(data,data.frame,graph,limit)在调用时可以 ans=fun1(data =d,limit=20,graph=True,data.fram=df),在函数定义时可以设置参数默认值。
参数是可以被传递的,以下函数fun1内使用了函数par,...表明把该函数的参数传递给par
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {if(graph) par(pch="*", ...)}
在函数内的赋值都是暂时的,若要全局赋值或者永久赋值可以使用<<-或者函数assign(一个对象的累决定了它会如何被泛型函数处理,如泛型函数plot(),summary(),anova(),调用的对象不同,函数内的处理方式也不同
使用methods(class="date.frame")可以查看data.frame类可以使用的泛型函数