R语言数据分析系列之二
书接上回,说完数据类型,我们来看看数据结构,R中的数据结构有:vector,matrix,array,dataframe,list,ts。今天来一起探讨一下R的vector。
在讲数据结构之前,先熟悉一下,本次讲解时要经常用到的函数:
本节常用函数
生成一个顺序序列seq
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
其实这相当于调用了seq函数
> seq(1,10)
[1] 1 2 3 4 5 6 7 8 9 10
更多的控制
> seq(1,10,by=2)
[1] 1 3 5 7 9
> seq(1,10,length.out=4)
[1] 1 4 7 10
by与length.out参数不可以同时出现,这个很明显,要查看详细的帮助可输入:
> ?seq
生成一个随机数序列rnorm,sample
> x <- rnorm(100)
> plot(x,type='l')
> x
[1] 1.453064905 -0.047887245 0.527939264 0.636644194 -1.922434465 0.312814684 0.866305334 -2.361032888 -0.464324391 0.136282213 -2.255356439
[12] 0.897798653 0.137509076 -0.057396839 0.628941641 0.512572490 0.184588557 0.901735555 -0.002088804 -1.435912499 -0.508949494 -0.339407714
[23] 2.725445769 -0.186044908 2.720510605 0.010690741 -0.137647637 -1.343382365 -1.190441367 1.162806038 0.609512764 1.499856819 -0.535139792
[34] -0.436777589 0.210434711 -1.650147717 -0.833774630 -0.520296609 0.954660317 -1.632116800 1.955973733 -0.017764751 -2.704259930 -0.819230300
> x <- sample(1:20,10)
> x
[1] 10 8 2 14 3 7 4 6 16 13
第一种方法生成的是服从标准正态分布的随机变量,第二种方法为从1到20的序列中随机无重复抽样的10个数。
数据结构
Vector 向量
R数据挖掘以及机器学习模型大部分都直接操作向量,所以向量也是R里面直接支持的数据结构;这里的向量指的都是列向量;
创建向量
创建向量很简单,只需要调用c() 即可那么我要创建一个随机的长度为5的向量如下:
> x_numeric <- sample(1:10,5)
> x_numeric
[1] 5 7 6 10 3
> x_character <- c('mon','tue','wen','thu','fir')
> x_character
[1] "mon" "tue" "wen" "thu" "fir"
> x_logical <- x_numeric == 5
> x_logical
[1] TRUE FALSE FALSE FALSE FALSE
这样我们就生成了三个类型得向量,分别是numeric型的,一种是character型的,另一种是logical型。
向量的属性以及访问
> names(x_numeric)
NULL
> names(x_numeric) <- x_character
> x_numeric
mon tue wen thu fir
5 7 6 10 3
> x_numeric[1]
mon
5
R语言中的下标都是从1开始得
> x_numeric[1] <- 10
> x_numeric[1]
mon
10
向量的操作
> sum(x_numeric)
[1] 36
> min(x_numeric)
[1] 3
> max(x_numeric)
[1] 10
> sort(x_numeric)
fir wen tue mon thu
3 6 7 10 10
> sort(x_numeric,decreasing=T)
mon thu tue wen fir
10 10 7 6 3
> summary(x_numeric)
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.0 6.0 7.0 7.2 10.0 10.0
summary可以给出数据集的概括,即最小值,第一四分位数,中位数,均值,第三四分位素,最大值,根据这些概括你可以对该数据集有更加深入的了解。
> x
[1] 7 10 4 8 3
> x[-2]
[1] 7 4 8 3
上面为删除第二个元素,那么如果要删除一个子集该如何做呢,如下:
> x[-(2:4)]
[1] 7 3
向量间的运算
> y <- c(x,x)
> y
[1] 7 10 4 8 3 7 10 4 8 3
> y <- x^2 + 1
> y
[1] 50 101 17 65 10
接下来继续看我们的带有names标签的向量
> x_numeric
montue wen thu fir
10 7 6 10 3
我们来以此向量为基础生成一个新的向量
> y <- c(x_numeric,x_numeric + rnorm(5))
> y
mon tue wen thu fir mon tue wen thu fir
10.000000 7.000000 6.000000 10.000000 3.000000 10.712022 7.242228 7.760792 11.479742 4.970038
里面得rnorm函数我们前面已经介绍过了,那么我们来求一下均值
> mean(y)
[1] 7.816482
但是如果我们想得到每个日期标签的分类均值怎么办呢,方法当然是有的,并且很方便如下:
> tapply(y,names(y),mean)
fir mon thu tue wen
3.98501910.356011 10.739871 7.121114 6.880396
这样利用tapply函数很轻松就搞定了,分类统计。其中第三个参数是一个函数,这个函数可以是系统自带的也可以是你自己定义的,自定义R函数后面在讲。
> x_numeric
montue wen thu fir
10 7 6 10 3
> which(x_numeric == 10)
monthu
1 4
which函数返回符合条件的下标,那么我们如果截取符合条件的子集合呢,如下:
> x_numeric[which(x_numeric == 10)]
monthu
10 10
在介绍一个函数叫subset
> subset(x_numeric,x_numeric==10)
monthu
10 10
当我们有一个子集,想要知道你子集中的元素是否在你的目标集合中包含的时候该如何做呢,如下:
> c(10,5) %in% x_numeric
[1] TRUEFALSE
运算符 %in%可以帮你轻松完成。
前面介绍了向量的排序sort那么要想反转一个集合而不用排序方法那就看看下面这个方法吧
> rev(x_numeric)
firthu wen tue mon
3 10 6 7 10
我们向量中明显有重复的数字,如果要去重,可以这样:
> x_numeric
montue wen thu fir
10 7 6 10 3
> unique(x_numeric)
[1] 10 7 6 3
多个向量有哪些方便得运算方式呢,下面看看这个:
> x <- c(sample(1:100,7))
> y <- c(sample(1:100,7))
> z <- c(sample(1:100,7))
> x
[1]70 84 41 4 35 90 11
> y
[1]52 43 3 16 86 27 64
> z
[1] 35 99 12 66 81 33 24
现在我们得到了三个数字类型得向量,我们希望找到每个向量第一个维度的值里面得最小值,和最大值怎么办呢
> pmin(x,y,z)
[1]35 43 3 4 35 27 11
> pmax(x,y,z)
[1] 70 99 41 66 86 90 64
其实我们还可以有别的方法,例如:
> apply(rbind(x,y,z),2,min)
[1] 35 43 3 4 35 27 11
具体的含义到下次matrix的时候在讲,今天就到这里吧。
最后咱们也来一个布朗运动的轨迹图:
n=100;x=cumsum(rnorm(n));y=rnorm(n); plot(x,y,type="b",col="red")