1、向量的基础
1.1 一个向量中存储的数据的模式必须相同
1.2 向量中的值在内存中是连续存储的,因此向量没有添加或删除某元素的功能,如果想达到添加或删除的效果,创建一个新的变量再将元向量的指针指向它。
如:x<-c(x[1:3],168,x[4])
1.3 向量调用:
</pre><pre name="code" class="plain">#方法1,每次循环,i的取值为x中的序号
for(i in length(x)){
}
#方法2,每次循环,i的取值为x中的一个值
for(i in x){
}
#注意,如果x为空,for(i in 1:length(x)) 语句会出错,r会进行两次循环(i分别取1和0),这显然不是我们想要的。
1.4 向量、矩阵和数组本质上都特殊的向量。
1.5 向量不需要声明,但直接调用一个不存在的向量中的某个元素,则会报错。
因此,应当这样操作:
>y<-vector(length=2)
>y[1]<-5
>y[2]<-12
另外,创建一个空的向量的方法:
#方法1
x<-c()
#方法2
x<-vector()
#方法3
x<-NULL
1.6 循环补齐
#较短的向量会自动循环补齐,以填充满所需的长度
> c(1,2,3)+c(5,6,3,4,5,6,4)
[1] 6 8 6 5 7 9 5
#实质上是:c(1,2,3,1,2,3,1)+c(5,6,3,4,5,6,4)
</pre><p></p><h2>2 向量运算</h2><p>2.1 基本理念:向量的每个运算符都是一个函数,加减乘除取模等普通运算,都是针对向量中的每个元素进行的,如果运算向量数目不匹配,则采用循环补齐</p><p>2.2 运算符(可跳过)</p><p> + 加</p><p>- 减</p><p>* 乘</p><p>/ 除</p><p>%% 取模</p><p>%*% 向量点乘,注意,这个运算显然是针对整个向量的。</p><p></p><h2>3 向量索引(重要)</h2><p></p><p>3.1 索引格式:向量1[向量2],它的返回结果是向量1中索引为向量2的那些元素</p><p></p><p></p><pre name="code" class="plain">> y<-c(1,2,3,4,5,6,7)
> y
[1] 1 2 3 4 5 6 7
> y[c(1,2,3)]
[1] 1 2 3
> y<-c(4,5,3,7,9,10)
> y[c(1,3)]
[1] 4 3
> y[1:5]
[1] 4 5 3 7 9
> y[c(1,1,3)]#选择的元素是可以复制的
[1] 4 4 3
3.2 负数表示把相应的元素删除,输出剩下的元素
> y[c(1,1,3)]
[1] 4 4 3
> y
[1] 4 5 3 7 9 10
> y[-1]
[1] 5 3 7 9 10
> y[-1:-3]
[1] 7 9 10
3.3 巧用length()帮助筛选
> y[-1]
[1] 5 3 7 9 10
#选择y除了最后一个元素的所有元素
#方法1
> y[1:length(y)-1]
[1] 4 5 3 7 9
#方法2
> y[-length(y)]
[1] 4 5 3 7 9
4 向量创建方式
4.1 v<-c(1,2,3)
(c的含义为combine)
4.2 v<-1:10
4.3 seq()
(由sequence得来)
#方法1
> v<-seq(0,100,5)
> v
[1] 0 5 10 15 20 25 30 35 40
[10] 45 50 55 60 65 70 75 80 85
[19] 90 95 100
#方法2
> v<-seq(from=12,to=30,by=3)
> v
[1] 12 15 18 21 24 27 30
#方法3
> v<-seq(from=1.1,to=2,length=10)
> v
[1] 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9
[10] 2.0
4.4 rep() 重复向量常量
> rep(c(5,12,13),3)
[1] 5 12 13 5 12 13 5 12 13
5 all() 与any()
> x<-1:10
> all(x>8)
[1] FALSE
> any(x>8)
[1] TRUE
6向量化运算(重要)
6.1 向量化运算指:如果希望对向量v中每一元素应用function f(),在很多情况向可以简单地对向量v调用f()即可,这样不仅可以使代码简洁易读,还可使R的运算效率成百上千的提高。注意,运算符在r中的本质也是函数,因此,可以这样向量化:
> u<-c(2,4,5)
> v<-c(4,3,2)
> u>v
[1] FALSE TRUE TRUE
#向量输入,向量输出
> f<-function(x) return(x^2)
> x<-c(1,2,3)
> f(x)
[1] 1 4 9
#向量输入,矩阵输出
> f<-function(x) return(cbind(x,x^2))
> x<-c(1,2,3)
> f(x)
x
[1,] 1 1
[2,] 2 4
[3,] 3 9
6.2 ifelse() 是向量化的重要方法。
7 筛选
7.1 筛选机制:生成筛选索引
这里的关键是一定要理解R处理筛选背后的机制
> z<-c(3,4,-4,3)
> z<-z[z*z>10]
> z
[1] 4 -4
</pre><pre>
上面是对vector z的一个筛选,下面来讲解这次筛选背后的处理原理
> z*z>10
[1] FALSE TRUE TRUE FALSE
注意,>也是一个函数,这个函数作用是比较z*z与10的大小,并且返回比较的结果向量。
> z<-z[z*z>10]
这一步代码的实质是:
z<-z[FALSE TRUE TRUE FALSE]
这样,我们就达到了筛选的目的。
7.2 使用subset()筛选
使用subset()筛选和使用筛选索引的区别在于,对NA值的处理
> c<-c(1,3,1:3,NA,5)
> c[c>2]
[1] 3 3 NA 5
> subset(c,c>2)
[1] 3 3 5
显然,筛选索引无法去除掉NA值,而subset()函数可以把NA自动剔除掉。
7.3 使用witch()
使用witch()函数可生成满足条件的元素在原向量中的索引。
> c
[1] 1 3 1 2 3 NA 5
> which(c>2)
[1] 2 5 7
8 NA 与NULL
8.1 NA与NULL的含义
NA代表缺失值;NULL代表不存在的值,而非存在而不知道的值。
> a<-c(1,2,NULL,3)
> mean(a)
[1] 2
> a<-c(1,2,NA,3)
> mean(a)
[1] NA
NULL没有模式,长度为0;而NA长度为一,如下:
> length(NULL)
[1] 0
> length(NA)
[1] 1
重点知识点:循环补齐;筛选;向量化;所有运算符都是函数