R语言数据分析系列之三
上次讲了vector这次讲matrix,array,dataframe,ts
数据结构
matrix 矩阵
R语言中矩阵可以理解为是由两个及两个以上的向量组成。
矩阵创建
从向量创建
> x <- sample(1:100,16)
> x
[1] 14 43 89 3 96 58 61 75 33 66 24 54 45 15 6 44
> m <- matrix(x)
> m
[,1]
[1,] 14
[2,] 43
[3,] 89
[4,] 3
[5,] 96
[6,] 58
[7,] 61
[8,] 75
[9,] 33
[10,] 66
[11,] 24
[12,] 54
[13,] 45
[14,] 15
[15,] 6
[16,] 44
我们看到现在是16*1矩阵那么我们如果得到我们想要的m*n矩阵呢,方法如下:
> dim(m) <- c(4,4)
> m
[,1] [,2] [,3] [,4]
[1,] 14 96 33 45
[2,] 43 58 66 15
[3,] 89 61 24 6
[4,] 3 75 54 44
也可以在创建的时候直接指定
> matrix(x,4,4)
我们发现这些矩阵在生成的时候都是按照列来采集数据的,那么我们可不可以按照行来生成矩阵呢,答案是可以的如下:
> matrix(x,4,4,byrow=T)
[,1] [,2] [,3] [,4]
[1,] 14 43 89 3
[2,] 96 58 61 75
[3,] 33 66 24 54
[4,] 45 15 6 44
dim函数用来查看矩阵的维度,也可以修改矩阵的维度,上面我们已经用到了。
矩阵的访问以及操作
刚才我们已经有了一个矩阵m那么我们如何访问矩阵中的向量以及元素呢,如下所示
按行访问:
> m[1,]
[1] 14 96 33 45
按列访问:
> m[,1]
[1] 14 43 89 3
访问某一个元素:
> m[2,3]
[1] 66
删除一列:
> m[,-1]
删除一行:
> m[-2,]
按行追加向量:
> rbind(m,c(1,1,1,1))
按列追加向量:
> cbind(m,c(2,2,2,2))
追加向量时要注意维度一定要一致。
矩阵运算:
先创建两个矩阵
> m1 <- matrix(sample(1:200,4),2,2)
> m2 <- matrix(sample(1:200,4),2,2)
矩阵加/减法:
m1 +(-) m2
矩阵间每个元素相加(减)得到新的矩阵
矩阵元素相乘
> m1 * m2
矩阵1与矩阵2的每个元素相乘得到新的矩阵。
矩阵乘法
> m1 %*% m2
矩阵转置
> t(m1)
解矩阵m1 %*% X = m2
> solve(m1,m2)
可直接解出来 X
特征值和特征向量
> res <- eigen(m1)
该函数返回一个list,第一个元素为values即特征值,第二个元素为vectors即特征向量。
Array 数组
R语言中的数组其实是矩阵的扩展,矩阵可以理解为一个二维数组。
创建一个三维数组
> a <- array(1:30,c(2,5,3))
访问数组的第一维数据
> a[,,1]
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
每个维度都是一个2 * 5矩阵
> class(a[,,1])
[1] "matrix"
访问第一个矩阵的第一行
> a[1,,1]
[1] 1 3 5 7 9
list 列表
list可以保存不同类型得向量,而数组不可以如:
> dl <- list(x=c(1,2,3),y=c('first','second'),z=(4+3i))
> dl[1]
$x [1] 1 2 3
> dl['x']
$x [1] 1 2 3
list 支持下标索引和列明索引
列表还可以转化为向量
> unlist(dl)
dataframe 数据框
R语言中数据框是最实用得一种数据结构,因为很多算法的输入就是数据框,并且数据的输入读取的结构类型大多是数据框,可见dataframe很重要。
Dataframe 数据框创建
> df.data <- data.frame(matrix(sample(1:20,16),c(4,4)))
> df.data
X1 X2 X3 X4
1 15 9 11 2
1 6 5 4 10
2 1 17 19 8
4 12 13 14 20
我们也可以直接创建:
> df.web <- data.frame(date = c('20150301','20150302','20150303','20150304'),pv=c(10234,20119,9087,15899),times=c(30.98,20.09,22.98,40.09))
> df.web
date pv times
1 20150301 10234 30.98
2 20150302 20119 20.09
3 20150303 9087 22.98
4 20150304 15899 40.09
Dataframe 数据框的索引
数据框的列和行都是可以单独命名的,并且可以通过这些名称索引也可以通过下标索引:
> names(df.web)
[1] "date" "pv" "times"
> row.names(df.web)
[1] "1" "2" "3" "4"
> row.names(df.web)[1] <- 'firstrow'
> row.names(df.web)
[1] "firstrow" "2" "3" "4"
通过列名可以索引整列,也可通过下标方式
> df.web$pv
[1] 10234 20119 9087 15899
> df.web[,2]
[1] 10234 20119 9087 15899
范围索引和matrix一样,比如:
> df.web[2:3,c('pv','times')]
pv times
2 20119 20.09
3 9087 22.98
subset函数,该函数可以用来方便的进行条件索引:
> subset(df.web,pv>10000&pv<20000,c(times,pv))
Dataframe 操作
rbind 与cbind
> levels(df.web$date)[5] <- '20150305'
> rbind(df.web,c('20150305',1,1))
> cbind(df.web,uv=c(2000,3000,4000,5000))
数据框的删除与matrix矩阵的删除方式一样,不在赘述。
ts 时间序列
时间序列是一种随着时间特性的变化数据,我们可以方便的进行季节性月度和年度的变化分析
时间序列创建的形式中如果将frequency=12为月度变化,设为4为季度变化,设为1为年度变化
首先虚拟出一个销量数据:
>data <- sample(10:10000,84)
年度:
> t <- ts(data[1:5],frequency=1,start=c(2006))
TimeSeries:
Start = 2006
End = 2010
Frequency = 1
[1] 3486 5375 8073 515 190
季度:
> t <-ts(data[1:16],frequency=4,start=c(2006))
> t
Qtr1Qtr2 Qtr3 Qtr4
2006 34865375 8073 515
2007 1907394 9468 3596
2008 23288779 7242 398
2009 7258740 3107 3177
月度:
> t <- ts(data[1:24],frequency=12,start=c(2006))
> t
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
2006 34865375 8073 515 190 7394 9468 3596 2328 8779 7242 398
2007 725 8740 3107 3177 4957 2640 3193 5132 26783074 6583 9592
> plot(decompose(t))
图中trend为变化趋势,seasonal季节性周期变化,random为随机误差。