在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