R语言数据结构包含:
向量(vector), 矩阵(matrix), 数组(array), 数据框(data frame), 列表(list). [索引从1开始]
基本向量类型
六种:逻辑型(logical),整数型(integer), 实数型(double),复数型(complex),字符型(string//character), 字节型(raw).可以通过typeof(),mode(),storage.mode()查看其向量的类型
只含有一个元素的向量是标量(标量只有大小没有方向,矢量既有大小又有方向)
cbind(),rbind()区别:
cbind:根据列进行合并,叠加所有列.[前提行数必须相同,cbind(a,b)] {column}
rbind:根据行进行合并,叠加所有行.[前提列数必须相同,rbind(a,b)] {row}
methods():
methods:查看其特定的类可以由哪些函数处理. eg:methods(class=lm)
identical():
判断向量是否相等,返回布尔值, identical(x,y).
which():
获取向量元素下标 which.max(),which.min(),which(a==3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| 1.
2. a=c(1,3,4,5,3,2,5,6,3,2,5,6,7,5,8)
3.
4.
5. which.max(a)
6.
7.
8. which.min(a)
9.
10.
11. which(a>3)
12.
13.
14. which(a==3)
15.
16.
17. b <- which(10:1 %in% a)
18. b
19. [1] 3 4 5 6 7 8 9 10
|
c函数:
c函数:用于合并一系列数字从而形成向量,数列[英文全拼:concatenate(把’’’连接在一起)]
names():
给向量的元素命名,eg:names(score)<-c(“A”,”B”,”C”,”D”)
向量
- seq创建向量:
seq(begin=1,end=3,by=2) #间隔等于2
矩阵
矩阵生成: matrix(data= NA,nrow=1,ncol=1,byrow=FALSE,dimnames =NULL); [byrow是否按行填充矩阵,dimnames维度名称]
x<-matrix(c(1:12),nrow=3,ncol=4,byrow=TRUE)
t(): 矩阵转置.
选取:
选取单个元素: x[2,4]
选取一行元素:x[2,]
选取多行多列元素:x[c(2,4),c(2,3)]
剔除矩阵的某行/某列元素: x[-1] #剔除第一行元素,同样适用于向量
x[-1,-2] #剔除第一行第二列的元素
行列命名:
rownames(matrix) #查看矩阵行名称
colnames(matrix) #查看矩阵列名称
rownames<-c(LETTERS[1:5]) #A-E为行命名
还可以通过行列名称选取相应值: x[‘A’,’B’];
dim()返回各个维度的最大值.
数据框: data.frame()
1 2 3 4 5 6 7 8 9
| observation<-c(1:6) birthday<-c("1/2","3/2","6/2","8/2","9/5","8/7") gender<-c('M','M','F','F','F','M') weight<-c(8.6,3.2,4.6,3.1,5.6,42.2) height<-c(78,32,31,51,53,31) bloodtype<-c('A','B','C','AB','O','A') breastmilk<-c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE) bady<-data.frame(observation,birthday,gender,weight,height,height,bloodtype,breastmilk) bady
|
访问数据框中的特定变量:例如选取生日和身高的数据: bady[,c(2,5)] 或者通过变量名称获取:bady[c(‘birthday’,’height’)] ||bady[c(2,5),]
bady$observation: $
选择结果转换为向量式,从而可以绘图或计算
summary(bady$height) #计算
plot(bady$observation,bady$height,type=’h’,lwd=5,xlab=’observation’,ylab=’height(cm)’,ylim= c(60,75),main=’身高数据’) #绘图
使用$比较繁琐,也可以使用
attach()#添加数据框到R语言的查询路径1 2 3 4 5 6
| detach()
两个函数要成对出现` .
|
因子(factor)
因子是R语言中较重要的向量对象(类别变量),eg: Grade:A,B,C,D,E,F
factor(x=character(),levels(),labels=levels,exclude=NA,ordered = is.ordered(x),nmax=NA) # x:向量,levels: 指定因子的水平值,ordered: 是否对因子的水平值进行排序,nmax: 水平值的上界,labels为levels添加标签,未包含于levels中需剔除的值
factors默认按字母顺序对应水平顺序
列表 list
列表是一种复杂的数据结构,可以包含不同类型的元素(向量,矩阵,数组,数据框,其他类型的列表).是由一些对象的有序结合构成的对象,每个对象成为列表的分量(components),它们的长度和类型可以不相同.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| > student<-c("John","Peter") > subject<-c("Math","Reading","History","Physics","Economics") > listOne<-list(subject,student) > listOne [[1]] [1] "Math" "Reading" "History" "Physics" "Economics"
[[2]] [1] "John" "Peter"
> listOne<-list(subjectNames=subject,studentNames=student) > listOne $subjectNames [1] "Math" "Reading" "History" "Physics" "Economics"
$studentNames [1] "John" "Peter"
> score<-matrix(c(95,80,60,72,84,58,32,65,43,49),nrow = 5,ncol = 2,dimnames = listOne) > score studentNames subjectNames John Peter Math 95 58 Reading 80 32 History 60 65 Physics 72 43 Economics 84 49 > x<-data.frame(score,gradeJohn=factor(c("A","B","D","C","B")),gradePeter=factor(c("B","D","D","D","D"))) > listTwo<-list(title="The Exam Results",listOne,x) > listTwo $title [1] "The Exam Results"
[[2]] [[2]]$subjectNames [1] "Math" "Reading" "History" "Physics" "Economics"
[[2]]$studentNames [1] "John" "Peter"
[[3]] John Peter gradeJohn gradePeter Math 95 58 A B Reading 80 32 B D History 60 65 D D Physics 72 43 C D Economics 84 49 B D
> listTwo[[2]] $subjectNames [1] "Math" "Reading" "History" "Physics" "Economics"
$studentNames [1] "John" "Peter"
> listTwo[[2]]$subjectNames [1] "Math" "Reading" "History" "Physics" "Economics" > listTwo$subjectNames NULL
|
时间序列
时间序列是特殊的矩阵或向量,由函数ts()创建,一元时间序列默认值 ts,多元时间序列默认值c(“mts”,”ts”) ,
ts(data=NA,start=1,end=numeric(),frequency=1,deltat=1,ts.eps=getOption("ts.eps"),class= ,names=)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| > ts1<-ts(1:10,2010,frequency=1) > ts1 Time Series: Start = 2010 End = 2019 Frequency = 1 [1] 1 2 3 4 5 6 7 8 9 10 > ts2<-ts(1:36,frequency=12,start=c(2010,3)) > ts2 Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 2010 1 2 3 4 5 6 7 8 9 10 2011 11 12 13 14 15 16 17 18 19 20 21 22 2012 23 24 25 26 27 28 29 30 31 32 33 34 2013 35 36 > ts3<-ts(matrix(rnorm(24),8,3),start=c(2010,1),frequency = 4) > ts3 Series 1 Series 2 Series 3 2010 Q1 -2.53265150 0.06600203 -0.9506540 2010 Q2 0.05894453 -0.84349820 -0.1765523 2010 Q3 -0.47160257 -1.52484881 0.3253143 2010 Q4 -0.68957525 0.12292570 0.4269442 2011 Q1 -2.47980475 0.59243573 -1.7735254 2011 Q2 -2.28164139 1.02340819 -0.7188506 2011 Q3 -1.14978250 -0.36354444 0.8143795 2011 Q4 0.20981269 0.37868089 -1.4009437 > ts3<-ts(matrix(rnorm(24),8,3),start=c(2010,1),frequency = 4,names=c("A","B","C")) > ts3 A B C 2010 Q1 -0.734254773 0.03228792 -0.839969064 2010 Q2 0.190277060 -0.37829225 0.896352619 2010 Q3 0.007298513 0.10820272 -0.140795278 2010 Q4 0.376817757 -1.10836939 -0.429474769 2011 Q1 -1.099760283 0.64250578 0.003784024 2011 Q2 -0.563540402 -0.69517193 -1.073160625 2011 Q3 -0.899862468 -0.23836692 -0.866785660 2011 Q4 -0.668345051 -0.49486593 0.167862363
|
数据载入
- 从外部获取数据
1 2 3 4 5 6 7 8 9 10 11 12
| read.csv() read.csv(file,header=TRUE,sep=",",quote="\",dec=".",fill=TRUE,comment.char="",...) #header首行是否为字段名,默认为TRUE, #sep字段的分隔符,默认为逗号 #quote指定字段的分隔符 #dec指定表示小数点的字符 #fill文件中是否忽略了行尾的字段 #comment.char表示注释符,默认为#,如果文件中没有注释,采用默认的 comment.char="" 即可 read.table() 扩展包gdata中的read.xls()函数 扩展包RODBC中的相关函数 扩展包foreign中的相关函数
|
数据输出
数据管理
- 访问数据
1 2 3
| > x<-seq(1,100,2) > x[10] [1] 19
|
字符串的处理
1 2 3 4 5 6 7 8
| - 字符串连接: paste()函数,paste(...,sep='',collapse=NULL) (1) ...表示一个或多个R对象,paste()函数将对象首先处理成字符串,然后再相互组合 (2)sep表示用于连接字符的自定义分隔符,例如空格、$、等等,默认为空格 (3)collapse参数为可选项,指定collapse参数时,会按照该参数值在之前组合的字符串基础上,再通过collapse参数进行分割,形成单独的长字符串,而非向量。 eg: > x<-paste(LETTERS[1:6],letters[1:6],sep="#",collapse = "&") > x [1] "A#a&B#b&C#c&D#d&E#e&F#f"
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| - 字符串拆分 strsplit(x,spilt,fixed=FALSE,perl=FALSE,useBytes=FALSE) (1)x:字符串向量,strspilt()函数依次对向量中每个元素进行拆分。 (2)spilt:指定处在拆分位置上的字符串,即在那个字符串处进行拆分, (3)fixed:用普通文本匹配还是用正则表达式进行匹配。默认正则匹配 (4)perl:表示使用perl语言的正则表达式,默认FALSE (5)useBytes:表示是否按字节进行匹配,默认为FALSE,表示按照字符而不是字节进行匹配。 strsplit()函数返回列表,unlist()函数将列表转换为字符串向量 eg: > year<-c("1990-1995","1996-2000","2001-2005") > splityear<-strsplit(year,split="-") > splityear [[1]] [1] "1990" "1995"
[[2]] [1] "1996" "2000"
[[3]] [1] "2001" "2005"
> unlist(splityear) [1] "1990" "1995" "1996" "2000" "2001" "2005" >
|
1 2 3 4 5 6 7 8
| boxplot绘制箱线图 boxplot(x, ..., range = 1.5, width = NULL, varwidth = FALSE, notch = FALSE, outline = TRUE, names, plot = TRUE, border = par("fg"), col = NULL, log = "", pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5), horizontal = FALSE, add = FALSE, at = NULL)
|
1 2
| 四分位数: 异常值计算方法:大于上四分位数的1.5倍分散度的值,或小于下四分位数1.5倍分散度的值,对于1.5至3倍分散度的异常值,用空心圆点表示,对于超出分散度三倍的异常值作为极端异常值处理,用实心圆点表示
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 散点图:plot()函数绘制分组数据的散点图 饼图:pie(x, labels = names(x), edges = 200, radius = 0.8, clockwise = FALSE, init.angle = if(clockwise) 90 else 0, density = NULL, angle = 45, col = NULL, border = NULL, lty = NULL, main = NULL, ...) (1)x为向量,其元素为非负的数值型数据,这些数据反映在 饼图的对应面积上。 (2)labels是表达式或者字符串,用以给数据添加标签。 (3)edges用来控制饼图外圈的圆润程度。饼图是由多边形拟合 而成的,edges数值越大,饼图的外圈看上去就越圆。 (4)radius用来控制饼图的半径,如果给数据添加的标签很长, 缩小饼图半径就能够将字符完整显示出来。 (5)clockwise用来控制排列顺序,即顺时针或逆时针方向排列。 (6)density用来控制阴影线的密度。 (7)angle用以控制阴影线的斜率。 (8)col是一个向量,用以填充被分割饼图的每一区域的颜色。 (9)main控制图的标题。 eg:pie(c(10,20,30,40),col=rainbow(4),labels=c("10%","20%","30%","40%"),main="PIE CHART")
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 柱状图:barplot(height, width = 1, space = NULL, names.arg = NULL, legend.text = NULL, beside = FALSE, horiz = FALSE, density = NULL, angle = 45, col = NULL, border = par("fg"), main = NULL, sub = NULL, xlab = NULL, ylab = NULL, xlim = NULL, ylim = NULL, xpd = TRUE, log = "", axes = TRUE, axisnames = TRUE, cex.axis = par("cex.axis"), cex.names = par("cex.axis"), inside = TRUE, plot = TRUE, axis.lty = 0, offset = 0, add = FALSE, args.legend = NULL, ...) (1)height是绘图所用到的数据,数据的大小差异体现在柱 形的高度上面。如果想要对一组数据进行绘图,则数据以向量 方式输入;如果想要对两组以上数据进行绘图,则数据以矩阵 方式输入,矩阵每一行代表一组数据。 (2)names.arg是图形中绘制于每个柱形下方的名称向量。如 果该参数被忽略,则名称就显示为向量所带的名称属性或矩阵 的名称列。 (3)legend.text用以控制图例。 (4)horiz控制柱形(条形)以垂直或水平方式放置。 (5)beside控制不同组数据以垂直方式堆积或水平方式并列 来进行展示。取FALSE(默认取值)时,不同组的数据以垂直方 式堆积展示。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| 直方图:hist(x, breaks = "Sturges", freq = NULL, probability = !freq, include.lowest = TRUE, right = TRUE, density = NULL, angle = 45, col = NULL, border = NULL, main = paste("Histogram of", xname), xlim = range(breaks), ylim = NULL, xlab = xname, ylab, axes = TRUE, plot = TRUE, labels = FALSE, nclass = NULL, warn.unused = TRUE, ...) (1)x是数值型向量,即所需要绘制直方图的数据集。 (2)breaks参数通过以下方式控制直方图的单元(cells)数 量: a) 给出一个向量,从而确定直方图单元的区间断点(breakpoints); b) 给出单个数值,从而确定直方图的单元数量; c) 给出计算区间的算法名称的字符串; d) 一个用于计算单元数量的函数。 (3)freq和probability均为逻辑判断式,且两者为互斥选项, freq=TRUE时做频率图,否则为概率密度图。当probability=TRUE 时,所有矩形的面积之和为1。 (4)labels是逻辑值,当labels=TRUE时,将添加相应的数值 到矩形单元的上方。 (5)density参数设置填充矩形条的阴影线(shading lines) 的密度,度量单位是每英寸填充的线条数。缺省模式下不绘制 阴影线。angle参数设定了阴影线的角度。 (6)col参数设定了填充矩形条内部的颜色,当density为正 数时,阴影线的颜色由col指定。 (7)border参数设置矩形条边框的颜色,当border=FALSE或 NA时,将不绘制边框。 (8)如果想要自己设定坐标,可以使用xaxt="n"或yaxt="n" 不绘制坐标,然后使用低级绘图命令axis来自定义坐标。
|
时间序列建模步骤:
目前, 最常用的平稳序列拟合模型是自回归模型 (AR 模 型)、移动平均模型 (MA 模型) 和自回归移动平均模型 (ARMA 模型). 这三类模型都属于有限参数线性模型,
arima.sim拟合函数: