R COOKBOOK 学习笔记

时间:2022-11-22 16:04:02
 
 help.start()
 args("lm") #快速获得函数的参数
 example("lm")
 help.search("lm")
 help.search("plot",package="party")
 help(package="party")
 vignette(package="party")  # 查看附加文档列表
 RSiteSearch("tree") #R网站查询
 
 print() cat() #print 一次只能打印一个对象 而cat 不是, 但cat 不能显示复合的对象, 如矩阵等
 x<<-3  #强制赋值给全区变量
 ls.str() #在ls的基础上带了对象信息
 rm(x)
 rm(list=ls())
 seq(from=1,to=5,by=2)
 seq(from=0,to=100,length.out=5)
 fib[-(1:3)]
 v[v>median(v)]
 v[(v<quantile(v,0.05))|(v>quantile(v,0.95))]
 v[!is.na(v)&is.NULL(v)]
 years["Carter"] #可使用名称引用向量中的元素
 (w-mean(w))/sd(w) #z~score
 
 require("party") #便于脚本的编写, 在载入失败时返回F
 library("party") # 失败是错误信息  此两函数相似
 
 getwd()
 setwd()
 save.image()
 
 .last.value #特殊变量,储存最近计算出的表达式值
 search() #查看当前R中载入的包
 
 getAnywhere("lda") #查找函数在哪个包里面
 MASS:::lda(x) #使用此函数
 data()
 data(Cars93,package="MASS") #载入包中的数据集
 library() #不含参数时列出已经安装的R包列表
 installed.packages()[,c("Package","Version")] # 列出安装的包
 source("hello.R",echo=T) #显示R提示符的命令代码
 
 Sys.getenv("SHELL")
 Sys.getenv("DISPLAY")
 Sys.getenv("R_HOME") #找到R的主目录
 Rprofile #设定初始参数,包括初始载入包等
 
 print(pi,digits=4)
 cat(format(pi,digits=4),"\n")
 
 sink("script_output.txt")  #输出结果到文件
 source("script.R")
 sink() # 关闭sink
 
 cat(result,file="analysisRepart.out",append=T) 
 con<-file("analysisReport.out","w") #文件连接
 cat(data,file=con)
 cat(results,file=con)
 close(con)
 
 list.files()
 records<-read.fwf("fixed-width.txt",widths=c(10,10,4,-1,4),col.names=c("Last","First","Born","Died") #读取固定宽度的文件
 dfrm<-read.table("statisticians.txt",stringAsFactor=F)
 tbl<-read.csv("table-data.csv",as.is=F)  #不转换为因子
 write(tbl,file="table-data.csv",row.names=T)
 
 library(xml)
url<-'http://www.example.com/data/table.html'
tbls<-readHTMLTable(url)
tbl<-readHTMLTable(url,which=3)


read.table, read.csv 面向行读取数据
readLines, scan 能面向行甚至每一个单元读取
lines<-readLines("input.txt",n=10)
singles<-scan("singles.txt",what=numeric(0))
triples<-scan("triples.txt",what=list(character(0),numeric(0),numeric(0))


world.series<-scan("http://lib.stat.cmu.edu/datasets/wseries", skip=35,nlines=23,what=list(year=integer(0),pattern=character(0)),)
library(RMySQL)
con<-dbConnect(MySQL(),user="userid",password="pswd",host="hostname",client.flag=CLIENT_MULTI_RESULT)
sel<-"select * from SurveyResults where city="Chicago"
rows<-dbGetQuery(con,sql)
if(dbMoreResults(con)) dbNextResults(con)
dbDisconnect(con)


save(MyData, file="MyData.Rdata")
load("MyData.RData)
dput, dump #采用ASCII保存


dim(A)<-c(2,3)
B<-list(1,2,3,4,5,6)
dim(B)<-c(2,3)


append(1:10,99,after=5) #向量合并比较慢
cbind(1:6,1:3) # 向量循环相加


unstack() stack() # 数据融合, 数据框按照向量合并成两列,然后又转化为数据框
years[c("Carter","Clinton")]<-NULL   #移除列表元素
unlist() #列表转换为向量
lst[sapply(lst,is.null)]<-NULL # 从列表中移除空值??, 注意Sapply应用于列表的每一个元素, 注意和years[c("Carter","Clinton")]<-NULL 区分
 
 dim(v)<-c(2,3) #向量直接变为矩阵
 solve(A) # 矩阵求逆
 
 
 rownames(mat)<-c("job","department")
 colnames(mat)<-c("job","department")
 
 row<-mat[1,drop=FALSE] #注意drop
 as.data.frame(lst)
 do.call(rbind.obs)
 
  f<-list(list(c(1,2,3),c(2,3,4)),list(c(6,7,8)))
  Map(as.data.frame,f)  # Map 把”列表的列表“转为数据框
  do.call(rbind,Map(as.data.frame,obs)
  
  N<-100000
  dfrm<-data.frame(dosage=numeric(N),lab=character(N))  #预先分配数据类型和行数
  subset(dfrm,select=c(predictor,response),subset=c(response>0)) # 注意应用,选择了列,选择了行
  subset(Car93,select=c(Manfufacturer,Model),subset=c(MPG.highway>median(MPG.highway)))
  subset(patient.data,select=c(-patient.id,-dosage))
  rbind(vec),cbind(vec) #建立一行或一列矩阵
  
  
  
  edit(dfrm)
  fix(dfrm)
  
  rbind() cbind() #也可进行数据框的操作
  merge(born,died,by="name") #数据框的连接  参数选择,类似SQL join 
  with(suburbs,(pop-mean(pop))/sd(pop)) #更容易的使用数据框列变量
  
  attach(suburbs)
  suburbs$pop<0
  pop ##插入一个数据框到搜索列表会插入一个临时副本,意味着对原数据框的改变被隐藏了,容易引起混淆
  
  
  clean<-na.omit(dfrm)   #数据框移除na, 列表不可以
  
  
  lapply(), sapply() # lapply 的返回结果是列表,而sapply的返回结果是向量,或者矩阵
 cor<-sapply(pred,cor,y=resp) # 注意第三个参数是第二个参数的参数
 tapply(x,f,fun) #将函数应用于列分组 f 为因子
 split()
 by(rials,trials$sex,summary) #把函数应用于行分组
 mapply(f, wec1,wec2,..wecn) #把函数应用于向量的每一个数
 
 nchar("James") #获取字符串长度 length 返回的是向量的长度
 s<-c("James","is","Good","emploee")
 substr(s,2,3)   #抽取字符
 
  strsplit(path,"/") #第二个参数可以是正则表达式 结果是列表
  sub(old,new,string) , gsub(old,new,string) # 字符代替,gsub代替所有实例, sub代替第一个实例
  print(), cat() #print 能显示出转移字符等特殊字符, 而cat不能,所以用print 打印特殊字符。
  
  f<-c("T1","T2","T3")
  d<-c("U1","U2","U3")
  m<-outer(f,d,paste,sep="-")   # outer本用于计算矩阵外积, 但可以变换函数, 可以生成卡迪尔积
  m[!lower.tri(m)] #上面产生的矩阵用下三角移除重复
  Sys.Date()
  as.Date("12/31/2010",format="%m/%d/%Y") # 注意大小写代表不同含义
  format(sys.Date())
  as.character(sys.Date())
  ISOdate(2012,2,29)
  as.date(ISOdate(2012,2,29))
  d<-as.Date("2010-3-15")
  p<-as.POSIXlt(d)   # 分解日期 年 月 日 等。。
  seq(from=s,by="month",length.out=12) #创建时间序列
  
  choose(5,2) #计算组合数
  combn(1:5,3) #生成组合
  runif(10) #均匀分布
  sample(c(F,T),20,replace=T,prob=c(0.2,0.8))
  d,p,r #d 开头概率密度函数,也称分布函数, p 开头累积概率函数
  pbinom(7,size=10,prob=0.5,lower.tail =F) # 右尾概论
  diff(pbinom(c(3,7),size=10,prob=0.5))  # 计算向量差, 计算两个概率之差
  qnorm(c(0.025,0.975)) # 分位数
  
  x<-seq(from=0,to=6,length.out=100)
  ylim<-c(0,0.6)
  plot(x,dunif(x,min=2,max=4),main="Uniform",type='l',ylim=ylim)
  abline(h=0.45,v=2)
  ploygon(region.x, region.y,density=10) #增加阴影区域
  mean(x>1) # 用这样的方式计算频数, 先转化成1,0 组成的向量,然后计算均值,最后就是发生的频数
  table(job, age) ,xtabs #列联表
  quantile(vec,c(.05.95)) #分位数
  z<-scale(f) # Z分数
  x<-rnorm(50,mean=100,sd=15)
  t.test(x,mu=95)
  t.test(x,conf.level=0.99)
  wilcox.test(x,conf.int=T) # 中位数置信区间
  prop.test(x,n,p) #样本比例检验
  runs.test(as.factor(s))  #游离检验
  t.test(x,y) #比较两样本均值
  t.test(x,y,paired=T) 
  wilcox.test(x,y,paired=T)  #
  wilcox.test(fav,unfav,paired=T) #
  cor.test(x,y,method="Spearman")
  success<-c(14,10)
  trials<-c(38,40)
  prop.test(success,trials)
  prop.test(x,n,p)
  pariwise.t.test(x,f)
  ks.test(x,y)
  plot(x,main="Forecast Result",xlab="Month",ylab="Production",col=c("red","black","green"))
  
  plot(x,main="the title",xlab="X-axis Label",ylab="Y-axis Label")
  plot(x,ann=F) # ann 表示先不绘制注释内容,然后调用title添加
  title(main="The Title",xlab="X Axis Label",ylab="Y Axis Label")  #增加内容
  grid() #网格
  points(13,21)
  with(iris,plot(Petal.Length,Petal.Width,pch=as.integer(Species)))
  f<-factor(iris$Species)
  legend(1.5,2.4,as.character(levels(f)),pch=1:length(levels(f)))
  abline(v=6)
  t<-lm(x[,1]~x[,2])
  abline(t)  #增加回归线
  plot(iris[,1:4]) # 多个变量,两两作图
   data(Cars93,package="MASS")
   coplot(Horsepower~MPG.city|Origin,data=Cars93) # 条件化图 condition plot |后面是因子
   heights<-tapply(airquality$Temp,airquality$Month,mean)
   barplot(heights,main="Mean Temp.by Month",
   names.arg=c("May","Jun","Jul","Aug","Sep"),ylab="Temp (deg.F)")  #条形图
   barplot2(heights,plot.ci=T,ci.l=lower,ci.u=upper) #增加置信区间的条形图, 置信区间需要单独算出然后带回
   rel.hts<-(heights-min(heights))/(max(heights)-min(heights))
   grays<-gray(1-rel.hts) #灰度  rainbow
   barplot(heights,col=grays,ylim=c(50,90),xpd=F,main="Mean Temp.By Month",names.arg=c("May","Jun","Jul","Aug","Sep"),ylab="Temp (deg.F)")
   plot(x,y,type="l",lwd=2)
   lines(x,y.indeps,col="yellow")
   
  xlim<-range(c(x1,x2))
  ylim<-range(c(y1,y2))
  plot(x1,y1,type='l'xlim=xlim,ylim=ylim)
  lines(x2,y2,lty="dashed")
  data(UScereal,package="MASS")
  boxplot(sugars~shelf,data=UScereal)
  lines(density(samp))
  plot(table(x),type='h',lwd=5,ylab="Freq")
  qqnorm(x)
  qqline(x)
 qqnorm(log(Cars93$Price),main="QQ plot: price")
 qqline(log(Cars93$Price))
 
 RATE<-1/10
 plot(qexp(ppoints(y),rate=RATE),sort(y))
 abline(a=0,b=1)
 colors<-ifelse (x>=5,"black","gray")
 plot(x, type='h',lwd=3,col=colors)
 f<-function(x) exp(-abs(x))*sin(2*pi*x)
 curve(f,-5,+5,main="Dampened Sine Wave")
 
 par(mfrow=c(2,3)) # 图像划分为2*3的矩阵
 par(mfcol=c(2,3)) # 按列增加图形
 win.graph(width=7.0,height=5.5) #打开另外一个图形窗口
  dev.set(2) #  设置活动窗口
 savePlot(filename="filename.ext",type=type)
 png("Mplot.png",width=648,height=432)
  curve(sin,-3,+3)
  dev.off()
  par(lwd=2)  # 许多设置参数, cex,col bg.
  
  lm(y~x)
  lm(y~u+v+w)
  lm(y~u+v+w,data=dfrm)
  
  m<-lm(y~x)
  coefficients(m)
  confint(m)
  deviance(m)
  fitted(m)  ##拟合y值的向量
  vcov(m) #协方差矩阵
   anova(m)
  lm(y~x+0) ##截距为零的线性方程
  lm(y~u*v) # 交互项的线性方程 包括所有可能的交 相当于y~u+v+u*v
  lm(y~u+v+w+u:v:w) # 只包含了uvw的交互,相当于y~u+v+w+uvw 没有uv,uw,wv 
  lm(y~(u+v+w)^2) # 二阶互交, 也可三阶, *,: 符合分配率, x*(u+v+z),x:(u+v+z)
  
  full.model<-lm(y~x1+x2+x3+x4)
  reduced.model<-step(full.model,direction="backward")
  
  min.model<-lm(y~1)
  fwd.model<-step(min.model,direction="forward",scope=(~x1+x2+x3+x4))
  fwd.model<-step(min.model,direction="forward",scope=(~x1+x2+x3+x4),trace=0) #只显示选择后的
  
  lm(y~x,subset=1:500)
  lm(y~x,subset=1:floor(length(x)/2))   # 选择子集进行回归
  lm(y~x,subset=(lab=="NJ"))
  m=lm(y~u+I(u^2))  #I(...) 计算表达式然后进行回归
  predict(m,newdata=data.frame(u=13.4))
  lm(y~poly(x,3,raw=TRUE)) # 多项式回归, raw为T
  lm(y~x+I(x^2)+I(x^3))
  lm(log(y)~x) 
  lm(sqrt(y)~month)
  lm(y~sqrt(x))
  lm(log(y)~log(x))
  library(MASS)
  m<-lm(y~x)
  boxcox(m) # 确定指数,然后进行回归。当线性无法满足了
  which.max(bc$y)
  lambda<-bc$x[which.max(bc$y)]
  z<-y^lambda
  ms<-lm(z~x)
  library(car)
  outlier.test(m) # 利用car包中的outlier来检测离群值
  influence.measures(m) # 识别有影响的观察值,异常?
  library(lmtest)
   dwtest(m)  # Durbin-Watson检查残差自相关
   dwtest(m,alternative="two.side")
   acf(m)  #检查残差自相关
   
   m<-lm(y~u+v+w)
   preds<-data.frame(u=3.1,v=4.0,w=5.5)
   predict(m,newdata=preds) 
   predict(m,newdata=preds,interval="prediction") 
   
   oneway.test(x~f)
   m<-aov(x~f)
   summary(m)
   
  library(faraway)
  data(rats)
  interaction.plot(rats$poison,rats$treat,rats$time)  #互交图
  
  m<-aov(x~f)  ##只进行方差分析验证均值不一样
  TukeyHSD(m)    ### 显示出那俩组数值的均值不一样。
  plot(TukeyHSD)
  
  kruskal.test(x~f) #不满足正态分布假设的费参数检验,稳健的检验中位数是否相同
  anova(m1,m2 ) ##比较两个模型是否有显著的区别
  
  tail(x) #查看最后几行
  option(width=120) #设置输出窗口的宽度
  
  x<-rnorm(1000)
  breaks<-c(-3,-2,-1,0,1,2,3)
  labels<-c("Bottom","Low","Neg","Pos","Hight","Top")
  f<-cut(x,breaks,labels) # 分箱
  summary(f)
  
  vec<-c(1,2,3,4,5)
  match(3,vec)
  
  v[seq_along(v)%%n==0]  ##每隔n个值取一个变量
  
  pmin()
  pmax()
  
  sides<-factor(c("Heads","Tails"))
  faces<-factor(c("1 pip",paste(2:6,"pips")))
  expand.grid(faces,sides)  ##生成多个因子的组合
  
  as.vector(as.matrix(dfrm))
  mean(as.matrix(daily.prod))
  
  dfrm<-dfrm[order(dfrm$key1,dfrm$key2),] # 对数据框两列排序
  
  m<-lm(resp~pred)
  slop<-coef(m)[2]
  str(slop)
  attributes(slope)<-NULL  # 移除变量属性
  attr(slop,"name")<NULL   # 移除变量属性
  
  class() #看是什么对象
  mode() #移除对象特性看内不, 它把class的特性去掉了
  str()  #看内部结构
  
  system.time(sum(rnorm(1000000)))
  warnings()
  suppressWarnings()
  
  numbers<-list(1,3,5,7,9)
  mean(unlist(numbers))
  
  lists<-list(col1=list(7,8,9),col2=list(70,80,90),col3=list(700,800,900))
  cbind(lists) # 不能很好的转化为矩阵
  do.call(cbind,lists)  ##转化为了矩阵
  cbind(lists[[1]],lists[[2]],lists[[3]])   ##转化为了矩阵 
  
  '%+-%'<-function(x,margin) x+c(-1,+1)*margin  # 定义二元运算符
  
  f<-function(x)3*x^4-2*x^3+3*x^2-4*x+5
  optimize(f,lower=-20,upper=20)  # 求单参数函数最大值和最小值
  optimize(f,lower=-20,upper=20,maximum=TRUE)
  
   
  f<-function(v){ a<-v[1];b<-v[2]
                  sum(abs(z-((x+a)^b)))
 }
    optim(c(1,1),f) # 求多参数函数最大值和最小值 c(1,1)为开始搜索点
optim(c(1,1),f control=list(fnscale=-1))   
eigen() #计算特征值和特征向量

  r<-prcomp(~x+y+z)  # 主成分分析
       summary(r)
  print(r)

   r<-prcomp(~x+y)
       slope<-r$rotation[2,1]/r$rotation[1,1]  #简单正交回归 主成分载荷计算斜率
  intercept<-r$center[2]-slope*r$center[1] # 用斜率在计算tie
  
  hc<-hclust(d)
  clust<-cutree(hc,k=3)
       head(clust,20)
       plot(x~factor(means),main="Original Clusters",xlab="Cluster Mean")
  
      data(pima,package="faraway")
      b<-factor(pima$test)
 m<-glm(b~diastolic+bmi,family=binomial, data=pima)  # 逻辑回归
 
 m.red<-glm(b~bmi,family=binomial,data=pima)
      newdata<-data.frame(bim=32.0)    #以data.frame存放数据
      predict(m.red,type="response",newdata=newdata)
 
 
 
 stat<-function(data,indices){
      r<-prcomp(~x+y,data=data,subset=indices)
      slope<-r$rotation[2,1]/r$rotation[1,1]
      return(slope)
       }
     boot.data<-data.frame(x=x,y=y)
     library(boot)
     reps<-boot(boot.data,stat,R=999) # 自助法抽样
     boot.ci(reps,type=c("perc","bca")) # 自助法抽样并求置信区间
factanal(diffs,factors=2) #因子分析
 
library(zoo) #时间序列包
library(xts)  #时间序列包
    prices<-c(132.45,130.85,130.00,129.55,130.85)
    dates<-as.Date(c("2010-01-04","2010-01-05","2010-01-06","2010-01-07","2010-01-08"))
    ibm.daily<-zoo(prices,dates)  #创建时间序列对象,prices可以是数据框, 是多元时间向量
    print(ibm.daily)
plot(ibm.daily2,screens=c(1,2))
ibm.daily[as.Date('2010-01-05')]
dates<-seq(as.Date('2010-01-04'),as.Date('2010-01-08'),by=2)
ibm.daily[dates]
filed.cpi<-na.locf(merge(cpi,empty,all=T)) #合并时间序列并补全缺失值
lag(ibm.daily,k=+1,na.pad=T) #时间序列的滞后
diff(ibm.daily) #计算差分
diff(ibm.daily,lag=12) 
log(ibm.daily)
ma<-rollmean(ts,k, align="right") #计算移动平均
apply.daily(ts,f) #日历范围内使用函数





vignette("zoo") # 查看包文档
plot(sqrt(251)*apply.monthly(as.xts(diff(log(ibm))),sd),main="IBM:Monthly Volatility",ylab="Std dev,annualized")
sds<-rollapply(ts,30,sd,by=30,align="right") #滚动函数
acf(ts) #自相关
box.test(ts) #检验时间序列自相关性
pacf(ts) #偏自相关
ccf(ts1,ts2) #交叉相关函数, 滞后的相关性
m<-lm(coredata(ts)~index(ts))
detr<-zoo(resid(m),index(ts)) #利用线性回归找到趋势, 然后剔除趋势
library(forecast)
auto.arima(x)
arima(x,order=c(p,d,q)
m<-ariam(x,order=c(2,1,2),fixed=c(0,NA,0,NA) #剔除不显著的参数
tsdig(m) #对模型进行检验
predict(m,n.ahead=10) #预测
library(tseries)
adf.test(coredata(ts))  #均值回归检验
library(fUnitRoots)
adfTest(coredata(ts1),type="nc")
library(KernSmooth)
t<-seq(from=-10,to=10,length.out=201)
    noise<-rnorm(201)
   y<-sin(t)+noise
    gridsize<-length(y)
   bw<-dpill(t,y,gridsize=gridsize)
   lp<-locpoly(x=t,y=y,bandwidth=bw,gridsize=gridsize) ##对数据平滑处理
   smooth<-lp$y