以前编S-Plus程序就会经常因为狂用函数而挨骂,其实在S-Plus中不多多使用内置函数真是枉费了AT&T贝尔实验室和MathSoft公司的一片苦心,也忽略了S-Plus语言的核心对象:向量和矩阵。每念及此,夜不能寐,就算挣扎着入睡,也会梦见AT&T和MathSoft哽咽着对我说……
基本
一、数据管理
vector:向量 numeric:数值型向量 logical:逻辑型向量 character:字符型向量 list:列表 data.frame:数据框 c:连接为向量或列表 length:求长度 subset:求子集 seq,sequence:等差序列 rep:重复 NA:缺失值 NULL:空对象 sort,order,unique,rev:排序 unlist:展平列表 attr,attributes:对象属性 mode,typeof:对象存储模式与类型 names:对象的名字属性
> vector("numeric",10)
[1] 0 0 0 0 0 0 0 0 0 0
> logical(13)
[1] F F F F F F F F F F F F F
> seq(10,1)
[1] 10 9 8 7 6 5 4 3 2 1
> unique(rep(1,10))
[1] 1
> rev(seq(10,1))
[1] 1 2 3 4 5 6 7 8 9 10
> unlist(list(1:6,"Xie Yihui"))
[1] "1" "2" "3" "4" "5" "6" "Xie Yihui"
二、字符串处理
character:字符型向量 nchar:字符数 substr:取子串 format,formatC:把对象用格式转换为字符串 paste,unpaste:连接或拆分 charmatch,pmatch:字符串匹配 grep,sub,gsub:模式匹配与替换
> paste("NO.",1:10)
[1] "NO. 1" "NO. 2" "NO. 3" "NO. 4" "NO. 5" "NO. 6" "NO. 7" "NO. 8"
[9] "NO. 9" "NO. 10"
> unpaste("Xie|Yihui",sep="|")
[[1]]:
[1] "Xie"
[[2]]:
[1] "Yihui"
三、复数
complex,Re,Im,Mod,Arg,Conj:复数函数
四、因子
factor:因子 codes:因子的编码 levels:因子的各水平的名字 nlevels:因子的水平个数 cut:把数值型对象分区间转换为因子 table:交叉频数表 split:按因子分组 aggregate:计算各数据子集的概括统计量 tapply:对“不规则”数组应用函数
> factor(c(1,0),labels=c("Male","Female"))
[1] Female Male
> table(rep(1:2,4),c(1:4,rep(8,4)))
1 2 3 4 8
1 1 0 1 0 2
2 0 1 0 1 2
数学
一、计算
+, -, *, /, ^, %%, %/%:四则运算 ceiling,floor,round,signif,trunc,zapsmall:舍入 max,min,pmax,pmin:最大最小值 range:最大值和最小值 sum,prod:向量元素和,积 cumsum,cumprod,cummax,cummin:累加、累乘 sort:排序 approx和approxfun:插值 diff:差分 sign:符号函数
> ceiling(5.21)
[1] 6
> cumprod(1:4)
[1] 1 2 6 24
> 911%%711
[1] 200
二、数学函数
abs,sqrt:绝对值,平方根 log, exp, log10, logb:对数与指数函数 sin,cos,tan,asin,acos,atan,atan2:三角函数 sinh,cosh,tanh,asinh,acosh,atanh:双曲函数 beta,lbeta,gamma,lgamma,digamma,trigamma,tetragamma,pentagamma,choose,lchoose:与贝塔函数、伽玛函数、组合数有关的特殊函数 fft,mvfft,convolve:富利叶变换及卷积 polyroot:多项式求根 poly:正交多项式 spline,splinefun:样条差值 besselI,besselK,besselJ,besselY,gammaCody:Bessel函数 deriv:简单表达式的符号微分或算法微分
> logb(9,base=3)
[1] 2
> deriv(~x^2,"x")
expression({
.value <- x^2
.grad <- array(0, c(length(.value), 1), list(NULL, "x"))
.grad[, "x"] <- 2 * x
attr(.value, "gradient") <- .grad
.value
}
)
> choose(9,7)
[1] 36
三、数组
array:建立数组 matrix:生成矩阵 data.matrix:把数据框转换为数值型矩阵 lower.tri:矩阵的下三角部分 mat.or.vec:生成矩阵或向量 t:矩阵转置 cbind:把列合并为矩阵 rbind:把行合并为矩阵 diag:矩阵对角元素向量或生成对角矩阵 aperm:数组转置 nrow,ncol:计算数组的行数和列数 dim:对象的维向量 dimnames:对象的维名 row/colnames:行名或列名 %*%:矩阵乘法 crossprod:矩阵交叉乘积(内积) outer:数组外积 kronecker:数组的Kronecker积 apply:对数组的某些维应用函数 tapply:对“不规则”数组应用函数 sweep:计算数组的概括统计量 aggregate:计算数据子集的概括统计量 scale:矩阵标准化 matplot:对矩阵各列绘图 cor:相关阵或协差阵 row:矩阵的行下标集 col:求列下标集
> diag(matrix(1:16,4,4,byrow=T))
[1] 1 6 11 16
> a<-matrix(1:4,2)
> a
[,1] [,2]
[1,] 1 3
[2,] 2 4
> t(a)
[,1] [,2]
[1,] 1 2
[2,] 3 4
> crossprod(a,t(a))
[,1] [,2]
[1,] 7 10
[2,] 15 22
> apply(a,2,mean)
[1] 1.5 3.5
四、线性代数
solve:解线性方程组或求逆 eigen:矩阵的特征值分解 svd:矩阵的奇异值分解 backsolve:解上三角或下三角方程组 chol:Choleski分解 qr:矩阵的QR分解 chol2inv:由Choleski分解求逆
> eigen(matrix(1:16,4))
$values:
[1] 3.620937e+001 -2.209373e+000 -1.031241e-016 0.000000e+000
$vectors:
[,1] [,2] [,3] [,4]
[1,] -0.5642946 0.78566010 -0.5460082 -4.60465
[2,] -0.6390124 0.40284883 0.7280110 5.80620
[3,] -0.7137302 0.02003756 0.1820027 2.20155
[4,] -0.7884480 -0.36277371 -0.3640055 -3.40310
五、逻辑运算
<,>,<=,>=,==,!=:比较运算符 !,&,&&,|,||,xor():逻辑运算符 logical:生成逻辑向量 all,any:逻辑向量都为真或存在真 ifelse():二者择一 match,%in%:查找 unique:找出互不相同的元素 which:找到真值下标集合 duplicated:找到重复元素
六、优化及求根
optimize,uniroot,polyroot:一维优化与求根
> f<-function(x) x^2-3*x+2
> uniroot(f,0.001,1.5,2.5)
$root:
[1] 1.999972
$f.root:
[1] -0.00002849252
$nf:
[1] 8
$neg:
[1] 1.999972
$f.neg:
[1] -0.00002849252
$pos:
[1] 2.000033
$f.pos:
[1] 0.00003254289
$message:
[1] "normal termination"
$aux:
list()
$call:
uniroot(f = f, interval = 0.001, lower = 1.5, upper = 2.5)
程序设计
一、控制结构
if,else,ifelse,switch:分支 for,while,repeat,break,next:循环 apply,lapply,sapply,tapply,sweep:替代循环的函数。
> if(1 == 2) {
print("1 is equal to 2!")
} else {
print("1 is not equal to 2!")
}
[1] "1 is not equal to 2!"
二、函数
function:函数定义 source:调用文件 call:函数调用 .C,.Fortran:调用C或者Fortran子程序的动态链接库。 Recall:递归调用 browser,debug,trace,traceback:程序调试 options:指定系统参数 missing:判断虚参是否有对应实参 nargs:参数个数 stop:终止函数执行 on.exit:指定退出时执行 eval,expression:表达式计算 system.time:表达式计算计时 invisible:使变量不显示 menu:选择菜单(字符列表菜单) 其它与函数有关的还有:delay,delete.response,deparse,do.call,dput,environment,formals,format.info,interactive,is.finite,is.function,is.language,is.recursive,match.arg,match.call,match.fun,model.extract,name,parse,substitute,sys.parent,warning,machine。
三、输入输出
cat,print:显示对象 sink:输出转向到指定文件 dump,save,dput,write:输出对象 scan,read.table,load,dget:读入
四、工作环境
ls,objects:显示对象列表 rm,remove:删除对象 q,quit:退出系统 .First,.Last:初始运行函数与退出运行函数 options:系统选项 ?,help,help.start,apropos:帮助功能 data:列出数据集
统计计算
一、统计分布
每一种分布有四个函数:d―density(密度函数),p―分布函数,q―分位数函数,r―随机数函数。比如,正态分布的这四个函数为dnorm,pnorm,qnorm,rnorm。下面我们列出各分布后缀,前面加前缀d、p、q或r就构成函数名:
norm:正态,t:t分布,f:F分布,chisq:卡方(包括非中心) unif:均匀,exp:指数,weibull:威布尔,gamma:伽玛,beta:贝塔 lnorm:对数正态,logis:逻辑分布,cauchy:柯西, binom:二项分布,geom:几何分布,hyper:超几何,nbinom:负二项,pois:泊松 signrank:符号秩,wilcox:秩和,tukey:学生化极差
> rnorm(10)
[1] -0.3648305 0.4973082 1.8412667 -0.2787127 0.0257934 0.6441702
[7] 0.5582823 -0.7876886 0.8104928 1.2928385
> pchisq(3.940,10)
[1] 0.04998691
二、简单统计量
sum, mean, var, sd, min, max, range, median, IQR(四分位间距)等为统计量,sort,order,rank与排序有关,其它还有ave,fivenum,mad,quantile,stem等。(注:我在S-Plus 6.2中似乎没找到fivenum函数,但是R中有,大家可以试试看)
三、统计检验
R中已实现的有chisq.test,prop.test,t.test。
> t.test(1:10,mu=2)
One-sample t-Test
data: 1:10
t = 3.6556, df = 9, p-value = 0.0053
alternative hypothesis: mean is not equal to 2
95 percent confidence interval:
3.334149 7.665851
sample estimates:
mean of x
5.5
四、多元分析
cor,cov.wt,var:协方差阵及相关阵计算 biplot,biplot.princomp:多元数据biplot图 cancor:典则相关 princomp:主成分分析 hclust:谱系聚类 kmeans:k-均值聚类 cmdscale:经典多维标度 其它有dist,mahalanobis,cov.rob
> cancor(matrix(1:80,10),matrix(70:21,10))
$cor:
[1] 1
$xcoef:
[,1]
[1,] 0.1100964
$ycoef:
[,1]
[1,] -0.1100964
$xcenter:
[1] 5.5 15.5 25.5 35.5 45.5 55.5 65.5 75.5
$ycenter:
[1] 65.5 55.5 45.5 35.5 25.5
五、时间序列
ts:时间序列对象 diff:计算差分 time:时间序列的采样时间 window:时间窗
六、统计模型
lm,glm,aov:线性模型、广义线性模型、方差分析
> x<-rnorm(100)
> y<-rchisq(100,9)
> lm(y~x)
Call:
lm(formula = y ~ x)
Coefficients:
(Intercept) x
8.180136 0.07897231
Degrees of freedom: 100 total; 98 residual
Residual standard error: 3.540729
抱歉,肚子饿了,得回去睡觉了。今天先写到这里。还有,本文函数大多来自于北京大学李东风老师的教程,在此向原作者的辛苦工作表示致谢。其中有一部分函数我作了小的删改,同时声明一下我所用的版本是S-Plus 6.2。