R语言的运行模式- 交互式: 交互式装载和运行R文件
source(“abc.R”) - 批处理形式: 批处理运行
Rscript abc.R
向量创建向量: 3:8
#> [1] 3 4 5 6 7 8
4:1
#> [1] 4 3 2 1
seq(3,8)
#> [1] 3 4 5 6 7 8
seq(3,8,2)
#> [1] 3 5 7
seq(from=12,to=21,by=3)
#> [1] 12 15 18 21
rep(0,5)
#> [1] 0 0 0 0 0
rep(1:2,3)
#> [1] 1 2 1 2 1 2
rep(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 9
x<-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 3
y[c(1,1,3)]
#> [1] 1 1 3
y[1:3] #第一到第三个元素
#> [1] 1 2 3
y[-1:-2] #负数的下标表示把相应的元素剔除
#> [1] 3 4 5 6
any和allx=seq(1,10)
any(x>7)
#> [1] TRUE
all(x>7)
#> [1] FALSE
all(x>0)
#> [1] TRUE
NA和NULLNA缺失值,通常需要进行处理,如mean(x,na.rm=T) NULL可用于在循环中创建向量 如 z<-NULL
for (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:5
z[z*z>4] <- 0
z
#> [1] 1 2 0 0 0
subset 也可用于筛选, 如:
z <- 5:1
subset(z,z>3)
#> [1] 5 4
选择函数which()z <- 3:7
which(z*z>16)
#> [1] 3 4 5
#which函数也可以用于筛选中,如
z[which(z*z>16)]
#> [1] 5 6 7
向量化ifelseifelse(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:3
names(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 4
v1[which(!duplicated(v1))]
#> [1] 1 2 3 4
向量运算x=1:3
y=4:6
x+y
#> [1] 5 7 9
x-y
#> [1] -3 -3 -3
x*y
#> [1] 4 10 18
y / x
#> [1] 4.0 2.5 2.0
y %% x
#> [1] 0 1 0
y > x
#> [1] TRUE TRUE TRUE
y < x
#> [1] FALSE FALSE FALSE
y == 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 6
y<-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 16
y<-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 8
y[1:2,] #取出y的第一二行
#> [,1] [,2] [,3] [,4]
#> [1,] 1 5 9 13
#> [2,] 2 6 10 14
y[,1:2] #取出y的第一二列
#> [,1] [,2]
#> [1,] 1 5
#> [2,] 2 6
#> [3,] 3 7
#> [4,] 4 8
y[2:3,2:3] #取出y的子矩阵
#> [,1] [,2]
#> [1,] 6 10
#> [2,] 7 11
矩阵元素筛选矩阵元素筛选 #取出y的行,其第二列>7,并且第三列>10
y[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:10
xa=array(x)
x
#> [1] 1 2 3 4 5 6 7 8 9 10
xa
#> [1] 1 2 3 4 5 6 7 8 9 10
#dim的返回值不同
dim(x)
#> NULL
dim(xa)
#> [1] 10
#class不同
class(x)
#> [1] "integer"
class(xa)
#> [1] "array"
二维数组和矩阵的区别列表创建列表j<-list(name='jianghang',age=24,salary=1000,url='http://www.')
j
#> $name
#> [1] "jianghang"
#>
#> $age
#> [1] 24
#>
#> $salary
#> [1] 1000
#>
#> $url
#> [1] "http://www."
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
列表上的apply函数lapply() 对列表的每个组件执行给定函数,如
lapply(list(1:3,2:4),mean) #返回列表形式。
#> [[1]]
#> [1] 2
#>
#> [[2]]
#> [1] 3
sapply(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./wordpress/archives/4912 转载请注明
|