R语言(1)——向量


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





重点知识点:循环补齐;筛选;向量化;所有运算符都是函数





























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值