在R语言中,不同长度的向量也是可以相加和相乘的,乘法的规则和加法类似
1,相同长度的向量相加
1
2
3
4
|
> x<- 1:4
> y<- 1:4
> z<- x+y
> z
|
1
|
[1] 2 4 6 8
|
规则就是 x[1]+y[1],x[2]+y[2],x[3]+y[3],x[4]+y[4]
1
2
3
4
5
|
> x<- 1:4
> y<- 1:4
> z<- x*y
> z
[1] 1 4 9 16
|
乘法也类似
2,不同长度的向量相加
1
2
3
4
5
6
7
8
|
> x<- 1:4
> y<- 1:3
> z<-x+y
警告信息:
In x + y : 长的对象长度不是短的对象长度的整倍数
> z
[1] 2 4 6 5
>
|
注意R返回了一个警告消息而不是一个错误消息, 因此这个操作实际上是被执行了的。
这一类的规则就是 x[1]+y[1],x[2]+y[2],x[3]+y[3],x[4]+y[1](因为y[3]就结束了,进入了又一次循环)
乘法规则类似
1
2
3
4
5
6
7
|
> x<- 1:4
> y<- 1:3
> z<- x*y
警告信息:
In x * y : 长的对象长度不是短的对象长度的整倍数
> z
[1] 1 4 9 4
|
另外,所得的向量长度为最长的那个向量的长度
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
> x<- 1:4
> y<- 1:3
> z<- 2:3
> w<- x+y+z
警告信息:
In x + y : 长的对象长度不是短的对象长度的整倍数
> w
[1] 4 7 8 8
> v <-x*y*z
警告信息:
In x * y : 长的对象长度不是短的对象长度的整倍数
> v
[1] 2 12 18 12
>
|
但是这里出了一个问题,
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
|
> x<- 1:4
> y<- 1:3
> z<- 2:3
> x+y+z
[1] 4 7 8 8
警告信息:
In x + y : 长的对象长度不是短的对象长度的整倍数
> x+z+y
[1] 4 7 8 8
警告信息:
In x + z + y : 长的对象长度不是短的对象长度的整倍数
> z+x+y
[1] 4 7 8 8
警告信息:
In z + x + y : 长的对象长度不是短的对象长度的整倍数
><span style= "color:#ff0000;" > z+y+x
[1] 4 7 8 7< /span >
警告信息:
1: In z + y : 长的对象长度不是短的对象长度的整倍数
2: In z + y + x : 长的对象长度不是短的对象长度的整倍数
> z*x*y
[1] 2 12 18 12
警告信息:
In z * x * y : 长的对象长度不是短的对象长度的整倍数
> z*y*x
[1] 2 12 18 8
警告信息:
1: In z * y : 长的对象长度不是短的对象长度的整倍数
2: In z * y * x : 长的对象长度不是短的对象长度的整倍数
>
|
不知道各位注意到了没有,难道我们的方法不对么
首先,加法和乘法运算,在没有括号等其他优先级的情况下是从左至右依次算的
我们来看一下
1
2
3
4
5
6
7
|
> x<- c(1,2,3,4)
> y<- c(1,2,3)
> z<- c(2,3)
> x+y
[1] 2 4 6 5
> x+y+z
[1] 4 7 8 8
|
1
2
3
4
|
> z+y
[1] 3 5 5
> z+y+x
[1] 4 7 8 7
|
所以说,不同长度的向量相加,顺序也是很重要的。
补充:R语言向量_常用的向量运算
向量运算与逻辑运算
1
2
3
4
5
6
7
|
> 2+3
[1] 5
> "+" (2,3)
[1] 5
> x<-c(1,2,4)
> x+c(5,0,-1)
[1] 6 2 3
|
这些都比较简单,就是简单的标量运算和向量运算,只不过是运算符可以放到前面,并且向量的对应元素需要相加罢了。
1
2
3
4
5
6
7
8
|
> x<-c(1,2,4)
> x*c(5,0,-1)
[1] 5 0 -4
> x<-c(1,2,4)
> x /c (5,4,-1)
[1] 0.2 0.5 -4.0
> x%%c(5,4,-1)
[1] 1 2 0
|
对于这几步的运算需要注意一下几点:*运算就是向量对应元素相乘,和线性代数里面的矩阵相乘并不一样。/运算就是对应元素相除就好。%%运算就是对应元素相除取余数。
向量索引
1
2
3
4
5
6
7
8
|
> y<-c(1.2,3.9,0.4,0.12)
> y[c(1,3)]
[1] 1.2 0.4
> y[2:3]
[1] 3.9 0.4
> v <-3:4
> y[ v ]
[1] 0.40 0.12
|
这些都比较容易,一看就会,不做详细解释
1
2
3
4
|
> x<-c(4,2,17,5)
> y<-x[c(1,1,3)]
> y
[1] 4 4 17
|
这个例子是想讲元素重复是允许的
1
2
3
4
5
|
> z<-c(5,12,13)
> z[-1]
[1] 12 13
> z[-1:-2]
[1] 13
|
带负号的下标代表我们想要把相应的元素剔除掉。
用:运算符创建向量
1
2
3
4
5
6
7
8
9
|
> 5:8
[1] 5 6 7 8
> 5:1
[1] 5 4 3 2 1
> i<-2
> 1:i-1
[1] 0 1
> 1:(i-1)
[1] 1
|
:运算符实际上就是为了得到一串等差数列,比较简单,但是要特别讲一下的是1:i-1和1:(i-1),这里面实际上及一个运算符优先级的问题,1:i-1是先计算1:i得到1 2,然后再减1得到0 1,而1:(i-1)是先计算i-1得到1后然后计算1:1,最后答案就是1.
使用seq()创建向量
这个函数也是用来生成等差数列的,具体用法看例子
1
2
|
> seq (from=12,to=30,by=3)
[1] 12 15 18 21 24 27 30
|
这一段代码表示从12到30生成等差数列,公差为3
1
2
|
> seq (from=1.1,to=2,length=10)
[1] 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0
|
这个表示从1.1到2生成10个数的等差数列
使用rep()重复向量常数
调用的格式是rep(x,times),表示创建times*length(x)个元素的向量,这个向量是有x重复times此构成。
1
2
3
4
5
6
7
8
9
|
> x<-rep(8,4)
> x
[1] 8 8 8 8
> rep(c(5,12,13),3)
[1] 5 12 13 5 12 13 5 12 13
> rep(1:3,2)
[1] 1 2 3 1 2 3
> rep(c(5,12,13),each=2)
[1] 5 5 12 12 13 13
|
最后一个each表示向量中每一个元素重复的次数,一个个元素重复的,不再是整个向量重复。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/hongjinlongno1/article/details/52263403