打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
R语言初学手册

R语言的运行模式

  • 交互式: 交互式装载和运行R文件source(“abc.R”)
  • 批处理形式: 批处理运行Rscript abc.R

向量

创建向量: 

3:8#> [1] 3 4 5 6 7 84:1#> [1] 4 3 2 1seq(3,8)#> [1] 3 4 5 6 7 8seq(3,8,2)#> [1] 3 5 7seq(from=12,to=21,by=3)#> [1] 12 15 18 21rep(0,5)#> [1] 0 0 0 0 0rep(1:2,3)#> [1] 1 2 1 2 1 2rep(c(1,2,3),each=2)#> [1] 1 1 2 2 3 3

添加删除元素 

x<-c(1,2,3,4)x<-c(x[1:3],5.5,x[4]) #添加5.5到最后一个元素之前x#> [1] 1.0 2.0 3.0 5.5 4.0#删除第三个元素y=x[-3]y#> [1] 1.0 2.0 5.5 4.0

获取向量长度 

x <- c(1,2,3,4,5,6)length(x)#> [1] 6

循环补齐

下面连个运算等价

x<-c(1,2,3)+ c(1,2,3,4,5,6)x#> [1] 2 4 6 5 7 9x<-c(1,2,3,1,2,3) + c(1,2,3,4,5,6)x#> [1] 2 4 6 5 7 9

向量运算+,-,*,/,%%,>,<,== 运算都是先补齐,然后逐个元素进行运算

向量索引

y<-c(1,2,3,4,5,6)y[c(1,3)] #第1,3个元素#> [1] 1 3y[c(1,1,3)]#> [1] 1 1 3y[1:3] #第一到第三个元素#> [1] 1 2 3y[-1:-2] #负数的下标表示把相应的元素剔除#> [1] 3 4 5 6

any和all

x=seq(1,10)any(x>7)#> [1] TRUEall(x>7)#> [1] FALSEall(x>0)#> [1] TRUE

NA和NULL

NA缺失值,通常需要进行处理,如mean(x,na.rm=T)

NULL可用于在循环中创建向量

z<-NULLfor (i in 1:10) if(i %% 2 == 0) z<-c(z,i)z#> [1]  2  4  6  8 10

筛选

这里不需要一个map函数,可以直接像下面这样使用[进行筛选

z<-c(1,2,3,4,5)#选出平方<4的元素z[z*z > 4]#> [1] 3 4 5

可以把筛选语句放在赋值运算符的左边,如

z <- 1:5z[z*z>4] <- 0z#> [1] 1 2 0 0 0

subset也可用于筛选, 如:

z <- 5:1subset(z,z>3)#> [1] 5 4

选择函数which()

z <- 3:7which(z*z>16) #> [1] 3 4 5#which函数也可以用于筛选中,如z[which(z*z>16)]#> [1] 5 6 7

向量化ifelse

ifelse(b,u,v)

b <- c(1,0,1,0,0)aa <- c(5,2,5,2,2)bb <- c(15,12,15,12,12)ifelse(b,aa,bb)#> [1]  5 12  5 12 12

向量元素命名:

z<- 1:3names(z) <-c('a','b','c')names(z)#> [1] "a" "b" "c"

去除重复元素

v1=c(1,2,2,3,4,3)unique.default(v1)#> [1] 1 2 3 4v1[which(!duplicated(v1))]#> [1] 1 2 3 4

向量运算

x=1:3y=4:6x+y#> [1] 5 7 9x-y#> [1] -3 -3 -3x*y#> [1]  4 10 18y / x#> [1] 4.0 2.5 2.0y %% x#> [1] 0 1 0y > x#> [1] TRUE TRUE TRUEy < x#> [1] FALSE FALSE FALSEy == x#> [1] FALSE FALSE FALSE

矩阵和数组

由向量创建矩阵

y<-matrix(c(1,2,3,4,5,6),nrow=2)y#>      [,1] [,2] [,3]#> [1,]    1    3    5#> [2,]    2    4    6y<-matrix(c(1,2,3,4,5,6),ncol=2)y#>      [,1] [,2]#> [1,]    1    4#> [2,]    2    5#> [3,]    3    6#也可用NA初始化一个矩阵y<-matrix(nrow=2,ncol=3)y#>      [,1] [,2] [,3]#> [1,]   NA   NA   NA#> [2,]   NA   NA   NA#矩阵是按列存储的。即先存第一列再存第二列。#可以使用byrow=T参数来指定矩阵按行存储。 #比较下面两个矩阵的区别y<-matrix(1:16,nrow=4,byrow=T)y#>      [,1] [,2] [,3] [,4]#> [1,]    1    2    3    4#> [2,]    5    6    7    8#> [3,]    9   10   11   12#> [4,]   13   14   15   16y<-matrix(1:16,nrow=4)y#>      [,1] [,2] [,3] [,4]#> [1,]    1    5    9   13#> [2,]    2    6   10   14#> [3,]    3    7   11   15#> [4,]    4    8   12   16

矩阵访问

y[,2] #取出y的第二列#> [1] 5 6 7 8y[1:2,] #取出y的第一二行#>      [,1] [,2] [,3] [,4]#> [1,]    1    5    9   13#> [2,]    2    6   10   14y[,1:2] #取出y的第一二列#>      [,1] [,2]#> [1,]    1    5#> [2,]    2    6#> [3,]    3    7#> [4,]    4    8y[2:3,2:3] #取出y的子矩阵#>      [,1] [,2]#> [1,]    6   10#> [2,]    7   11

矩阵元素筛选

矩阵元素筛选

#取出y的行,其第二列>7,并且第三列>10y[y[,2]>7 & y[,3]>10,]#> [1]  4  8 12 16

矩阵运算

矩阵相乘 %\*%  这个不是逐元素计算的,而是数学上的矩阵相乘,要逐元素相乘,使用*运算符

对矩阵的行和列调用函数

apply(m,dimcode,f,fargs) m是矩阵,dimcode指定行或者列,1表示行,2表示列。f为要使用的函数,fargs是可选参数

apply(y,1,mean) 对y每行求平均。

apply(y,1,mean)#> [1]  7  8  9 10

需要注意apply函数返回的矩阵元素排列的行列问题,必要时使用t()函数对矩阵进行转置。

改变矩阵大小

cbind,rbind分别为矩阵添加列和添加行,两个向量也可以直接构造矩阵,

cbind(c(1,2),c(3,4))#>      [,1] [,2]#> [1,]    1    3#> [2,]    2    4

矩阵的长度

因为矩阵也是向量,所以length(y)返回的是矩阵的元素个数。nrow(y),ncol(y)分别返回矩阵的行数和列数

矩阵的行列命名

y <- matrix(1:4,nrow=2)colnames(y)<-c('col1','col2')rownames(y)<-c('row1','row2')y#>      col1 col2#> row1    1    3#> row2    2    4

数组

数组的构造

array(data = NA, dim = length(data), dimnames = NULL)

高维数组

R中用不同的行表示不同的观测,不同的列表示不同的变量,如果再添加上时间变量,数据就变成三维的了。三维数组是在矩阵的基础上再添加一个层的概念。如

firsttest<-matrix(c(1,2,3,4),ncol=2)secondtest<-matrix(c(5,6,7,8),ncol=2)tests<-array(c(firsttest,secondtest),dim=c(2,2,2))tests#> , , 1#> #>      [,1] [,2]#> [1,]    1    3#> [2,]    2    4#> #> , , 2#> #>      [,1] [,2]#> [1,]    5    7#> [2,]    6    8

其中dim最后一个2表示数据分为两层。tests中的数据由三个下标来访问。

一维数组和向量的区别

x=1:10xa=array(x)x#>  [1]  1  2  3  4  5  6  7  8  9 10xa#>  [1]  1  2  3  4  5  6  7  8  9 10#dim的返回值不同dim(x)#> NULLdim(xa)#> [1] 10#class不同class(x)#> [1] "integer"class(xa)#> [1] "array"

二维数组和矩阵的区别

列表

创建列表

j<-list(name='jianghang',age=24,salary=1000,url='http://www.bagualu.net')j#> $name#> [1] "jianghang"#> #> $age#> [1] 24#> #> $salary#> [1] 1000#> #> $url#> [1] "http://www.bagualu.net"k<-list(1:5,2:10)k#> [[1]]#> [1] 1 2 3 4 5#> #> [[2]]#> [1]  2  3  4  5  6  7  8  9 10

列表元素访问

j[['name']]#> [1] "jianghang"j[[1]]#> [1] "jianghang"j[1]#> $name#> [1] "jianghang"#列表中的名字names(j)#> [1] "name"   "age"    "salary" "url"

注意双中括号和单中括号的区别,单中括号返回的是列表类型,双中括号则返回的是单个元素类型。

添加元素

j[['phone']]=13623232323

删除元素

j[['phone']]=NULL

获取列表长度

length(j)#> [1] 4

列表上的apply函数

lapply()对列表的每个组件执行给定函数,如

lapply(list(1:3,2:4),mean) #返回列表形式。#> [[1]]#> [1] 2#> #> [[2]]#> [1] 3sapply(list(1:3,2:4),mean) #返回的是向量形式。#> [1] 2 3

sapply也可以返回矩阵形式,如果执行的函数返回的是向量。

递归列表定义

rl<-list(a=1,b=list(1:3,2:4))rl#> $a#> [1] 1#> #> $b#> $b[[1]]#> [1] 1 2 3#> #> $b[[2]]#> [1] 2 3 4

数据框

数据框结构类似矩阵,只是每列的数据类型可以不一样。但是每列的长度是要求一样的。

创建数据框:d<-data.frame(a=c(1,2,3,4),names=c(“a”,”b”,”c”,”d”))

访问元素:d$a 访问a列, d$names访问names列, 也可用矩阵方式来访问: d[,1] 得到d的第一列

提取子数据框: d[2:3,2,drop=FALSE] 注意这里的drop参数,表示返回的依然是一个数据框而不是向量

缺失值的处理: 如果d中有NA,可以用complete.cases来去掉缺失值. d[complete.cases(d),] 即为没有缺失值的行组成的数据框

rbind和cbind可同样用于数据框,只是要求行或者列的长度与原数据框一样

如果数据框的每列数据类型相同,可以使用apply函数, 使用方法和矩阵一样。

合并数据框:merge(x,y), merge根据x,y中的同名列来合并x,y的列. 如果x,y中没有同名的列,可以用by.x , by.y来指定列的名字。

数据框是列表的特列,可以像列表那样在数据框上使用lapply和sapply

 因子和水平

x<-c(5,12,13,12)

xf<-factor(x)    因子xf包含有三个水平5,12,13 , 因子长度length(xf)是数据的长度为4,即c(1,2,3,2),而不是因子的个数

tapply(x,f,g) 函数,  其中x是向量,f是因子,g是函数。意思是对因子f的每个水平调用函数g。

如ages<-c(25,26,27,55)  aff<-c(“A”,”A”,”B”,”C”)  tapply(ages,aff,mean) ,先对ages按照aff分组,然后每组求平均。

split()函数 ,将向量根据因子进行分组。 基本形式为split(x,f)  ,返回值为list类型,x为向量或者数据框,f为因子或者因子的列表。, 如split(d$income,list(d$gender,d$over25))  其中d为一个数据框,包含有列income,gender,over25.

by()函数和tapply相似,区别是by可以作用于数据框,而不仅仅是向量。如by(d,d$gender,function(m) lm(m[,2]~[,3])) 表示对数据框d,先按照gender因子分组,然后对每组进行回归分析。

表的操作:fl<-list(c(5,12,13,12,13),c(“a”,”bc”,”a”,”bc”,”a”))   table(fl) 将生成两个因子的频数表。因此table的第一个参数为因子或者因子的列表 , 列表也可以是三维的或1维的。

table元素的访问也可以像矩阵一样通过下标来访问。另外可以通过addmargins(tbl)来获得该表的边际值。

aggregate()汇总函数,实例:aggregate(aba[,-1],list(aba$Gender),median) , 表示取数据框第一列以外的其他列,按照Gender分组后,对每一列(每个变量)调用median函数。

cut()函数,该函数给定一个数据向量x,一个区间向量b,确定x中每个元素将落入哪个区间。返回区间的序号向量。

如z<-rnorm(10) bin<-seq(from=0.0,to=1.0,by=0.1)  cut(z,bin,labels=F) 即计算z的每个值位于bin的哪个区间。

 R语言编程结构

for (n in x) {print(n)}

i<-10 while(i>0) { i <- i -1}

while(TRUE) { i <- i +1  if (i<0) break}

repeat {i <-i-1  if(i<0) break}

直接进行下一次循环,用next语句

if( x== 4) { x<- 1 } else{ x<-2}

算术运算及逻辑运算符:

+,-,*,/,^,%%(模运算),%/%(整数除法),==,<=,>=,&&(标量逻辑与操作),||,&(向量逻辑与操作),|,!

数学函数

exp(),log(),log10(),seqrt(),abs(),sin(),cos(),min(),max(),which.min(),which.max(),pmin(),pmax(),sum(),prod(), cumsum(),cumprod(),round(),floor(),ceiling(), factorial()

微分: D(expression(exp(x^2)),”x”) , 给出微分形式

积分: integrate(function(x) x^2,0,1) —>0.333

统计分布函数: [dpqr][norm|chisq|binom] 等函数  d概率密度函数,p累计分布,q对应分布的分位数,r随机生成函数

排序:sort(x) , order(x) , order函数返回的排序后的索引向量,可用于对数据框进行排序。 rank(x) 返回每个元素在向量中的排名序号。

向量点积:  crossprod(1:3,c(5,12,13))   注意这个名字有些问题,计算的是点积(1*5+2*12+3*13)而不是叉积。

矩阵乘法: %*%

解线性方程组: solve(a,b) ,  a是系数矩阵,b是方程右边的值。 如果调用solve时不指定b,则返回矩阵a的逆矩阵。

更多函数: t() 矩阵转置, qr() 矩阵QR分解, chol() Cholesky分解 , det() 矩阵行列式的值, eigen()矩阵的特征值和特征向量

diag() 从方阵中提出对角矩阵 sweep() 数值分析批量运算符

sweep举例:sweep(x,1,c(1,2,3),”+”) 表示对矩阵x的1,2,3行分别加上数值1,2,3 , 第二个参数1表明是对行进行操作。

集合运算: union(x,y)并集 , intersect(x,y) 交集, setdiff(x,y)集合的差, seqequal(x,y)检验集合是否相等 c %in% x 判断x是否在集合x里面

S3类

寻找泛型函数:methods(print)  列出所有的print函数,标星的为不在默认命名空间中的函数,可以通过getAnywhere()来找到这些函数,然后使用命名空间限定符访问他们。getAnywhere(print.ABC)  , 如果找到会列出其所在的命名空间(假设为util),然后利用util:::print.ABC() 来调用这个函数。

查找一个类中所有的函数可以利用 methods(class=”lm”)后面的lm 为类名。

编写一个s3类,只需给定类名即可,class(alist)<-className  为类添加方法:

print.className<-function() 这样,print(className)即会调用到这个方法。

继承: 给定类名时,给出的是一个向量而不是一个名字,前面的类继承后面的类。

如: class(x)<-c(subclass,parentClass)

这样父类定义的方法,子类也可以使用。

S4类

s3类有安全隐患,因为有时候成员变量写错了,s3并不会给提示。S4类加强了这类检查。语法上也有不同。

定义类: setClass()

创建对象 : new()

引用成员变量 @

实现泛型函数: setMethod()

声明泛型函数: setGeneric()

对象管理

列出所有的对象: ls()

删除对象: rm() , 删除所有对象: rm(list=ls())

保存对象: save(x,”xfile”) 把x保存在文件xfile中,后面可以用load(“xfile”)装载这个对象

查看对象内部结构:class(x) mode(x) names(x) attributes(x) unclass(x) str(x) edit(x)  edit函数可以看到该对象的所有数据,看起来最有用了。

exists(“x”) 查看对象是否存在 其中x为对象名字,需要用引号

读文件

scan()函数 , 读取文本文件,缺省情况下读取文件中以空格分割的所有浮点数值。 即scan(“a.txt”) , 返回一个向量

如果文件中包含非数值,可以字符串形式读入,scan(“a.txt”,what=””) , 返回所有已空格分割的字符串向量。

如果指定分隔符为换行,scan(“a.txt”,what=””,sep=”\n”) 返回以换行分割的字符串向量

readline() 可以从键盘读取单行数据,如age<-readline(“input the age:”)

如果数据为表格形式:因为有表头,用scan不能读入,可以用read.table()函数。

如果全是数据,且为矩阵形式,可以用matrix+ scan读入矩阵,x<-matrix(scan(“x”),nrow=5,byrow=T)

readLines(“a.txt”) 可以读取文本文件,每一行当做一个字符串。等价于scan中指定分隔符为换行

readLines也可以一次读取一行:如下:
aa<-file(“a.txt”,”r”)

while(T){

rl<-readLines(aa,n=1)
if(length(rl) ==0) {print(“feof”)   break}

else{print(rl)}
}

seek()函数可以移动文件指针。

read.table和scan也可以以网站地址作为参数,一次来读取网络上的数据。read.table(“http://xx.xx.xx”,head=T)

写文件

write.table() 把数据框输出到文件

矩阵也可以直接利用write.table写入文件,不过要声明row.names=F,col.names=F ,即不输出行名和列名

cat也可以用来写文件, cat(“def\n”,file=”xx”,append=T) 追加的时候要加上append参数

cat可以一次写多个值,cat(file=”xx”,”a”,”b”,”c”)

writeLines()

ff<-file(“www”,”w”)

writeLines(c(“abc”,”def”,”gg”),ff)

close(ff)

将生成一个三行的文件。

获取文件目录信息

file.info()

dir() 列出指定目录中所有的文件,可选参数recursive=T可递归列出所有的子目录文件

file.exists()判断文件是否存在

getwd() setwd()获得和设置当前工作目录

文件copy等

file.copy(from, to, overwrite = recursive, recursive = FALSE,               copy.mode = TRUE, copy.date = FALSE)file.rename(from, to)file.remove(...)

字符串操作

grep()  grep(“he”,c(“hello”,”world”,”hhe”,”haha”))  —>返回c(1,3) ,如果没有匹配的,则返回一个空向量

nchar(“abc”)  —>3   返回字符串的长度, 注意如果参数不是字符串,返回值可能无法预料,如nchar(NA)=2

paste(“a”,”b”,”c”)  —>”abc”  拼接字符串, 可以指定sep=”” ,指定拼接是的分隔符

把一个字符串向量拼接成单个字符串,使用collapse参数。如:

aa=c("hello","world")paste(aa,collapse=" ")#> [1] "hello world"
  • 抽取字符串,使用stringr::str_extract , 如下所示
aa=c("markdown/p123.html","markdown/p345.html","markdown/p789.html")bb=stringr::str_extract(aa,"p\\d+")bb#> [1] "p123" "p345" "p789"sprintf("%s.md",bb)#> [1] "p123.md" "p345.md" "p789.md"
  • 替换
stringi::stri_replace_all_regex("aaa-bb","(a+)\\-(b+)","$1+$2")#> [1] "aaa+bb"

sprintf(“aa is %d”,4)  生成格式化的字符串

substr(x,start,stop) 返回字符串x的start:stop上的子字符串

strsplit(x,split) 根据split将x分割成若干字符串,返回字符串组成的列表

regexpr(“he”,”wwwhe”)  返回he在后面字符串中出现的位置,此例返回4

gregexpr , 意义同上面的函数,只是返回所有的位置,而不仅仅是第一个位置

上面的grep,regexpr,gregexpr等函数,第一个参数可以是正则表达式

  • 字符串替换 sub/gsub可以用来替换字符串中的给定模式。调用方式为 sub(pattern,replacement,x)
aa=c("hello","world","!")bb=sub('l',"L",aa)bb#> [1] "heLlo" "worLd" "!"bb=gsub('l',"L",aa)bb#> [1] "heLLo" "worLd" "!"
  • 解析网页时指定编码

library(XML)
doc<-htmlTreeParse(url,useInternalNodes=T,encoding=”gb2312″)

如果是utf8编码的网页,则不需要后面的两个参数.

全局参数

获得所有的参数使用options(), 设置某个参数,比如stringsAsFactors 使用options(stringAsFactors = FALSE)

下面是所有的参数,供参考

options()#> $add.smooth#> [1] TRUE#> #> $bitmapType#> [1] "cairo"#> #> $browser#> [1] "xdg-open"#> #> $browserNLdisabled#> [1] FALSE#> #> $CBoundsCheck#> [1] FALSE#> #> $check.bounds#> [1] FALSE#> #> $citation.bibtex.max#> [1] 1#> #> $continue#> [1] "+ "#> #> $contrasts#>         unordered           ordered #> "contr.treatment"      "contr.poly" #> #> $defaultPackages#> [1] "datasets"  "utils"     "grDevices" "graphics"  "stats"    #> #> $demo.ask#> [1] "default"#> #> $deparse.cutoff#> [1] 60#> #> $device#> function (width = 7, height = 7, ...) #> {#>     grDevices::pdf(NULL, width, height, ...)#> }#> <environment: namespace:knitr>#> #> $device.ask.default#> [1] FALSE#> #> $digits#> [1] 7#> #> $dvipscmd#> [1] "dvips"#> #> $echo#> [1] FALSE#> #> $editor#> [1] "vi"#> #> $encoding#> [1] "native.enc"#> #> $example.ask#> [1] "default"#> #> $expressions#> [1] 5000#> #> $help.search.types#> [1] "vignette" "demo"     "help"    #> #> $help.try.all.packages#> [1] FALSE#> #> $HTTPUserAgent#> [1] "R (3.2.2 x86_64-pc-linux-gnu x86_64 linux-gnu)"#> #> $internet.info#> [1] 2#> #> $keep.source#> [1] FALSE#> #> $keep.source.pkgs#> [1] FALSE#> #> $knitr.in.progress#> [1] TRUE#> #> $locatorBell#> [1] TRUE#> #> $mailer#> [1] "mailto"#> #> $max.print#> [1] 99999#> #> $menu.graphics#> [1] TRUE#> #> $na.action#> [1] "na.omit"#> #> $nwarnings#> [1] 50#> #> $OutDec#> [1] "."#> #> $pager#> [1] "/usr/lib/R/bin/pager"#> #> $papersize#> [1] "a4"#> #> $pdfviewer#> [1] "/usr/bin/xdg-open"#> #> $pkgType#> [1] "source"#> #> $printcmd#> [1] "/usr/bin/lpr"#> #> $prompt#> [1] "> "#> #> $repos#>     CRAN #> "@CRAN@" #> #> $rl_word_breaks#> [1] " \t\n\"\\'`><=%;,|&{()}"#> #> $scipen#> [1] 0#> #> $show.coef.Pvalues#> [1] TRUE#> #> $showErrorCalls#> [1] TRUE#> #> $show.error.messages#> [1] TRUE#> #> $show.signif.stars#> [1] TRUE#> #> $str#> $str$strict.width#> [1] "no"#> #> $str$digits.d#> [1] 3#> #> $str$vec.len#> [1] 4#> #> #> $str.dendrogram.last#> [1] "`"#> #> $stringsAsFactors#> [1] TRUE#> #> $texi2dvi#> [1] "/usr/bin/texi2dvi"#> #> $tikzMetricsDictionary#> [1] "p4912-tikzDictionary"#> #> $timeout#> [1] 60#> #> $ts.eps#> [1] 1e-05#> #> $ts.S.compat#> [1] FALSE#> #> $unzip#> [1] "/usr/bin/unzip"#> #> $useFancyQuotes#> [1] FALSE#> #> $verbose#> [1] FALSE#> #> $warn#> [1] 0#> #> $warning.length#> [1] 1000#> #> $width#> [1] 65


本文地址: http://www.bagualu.net/wordpress/archives/4912 转载请注明


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
R语言函数总结
掌握R语言中的apply函数族 | 粉丝日志
R语言系列第一期(番外篇 ):R的6种对象—向量、矩阵、数组、因子、列表、数据框
【量化小科普】MATLAB金融工具箱入门
R语言学习笔记
2.S向量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服