这篇博客接着讲有关向量的操作,将主要讲:
c()
函数的参数向量的基本运算
另外三种创建向量的方式:冒号
:
运算符、seq()
函数和rep()
函数
1. c()
函数的参数
上篇博客说过,向量中的元素必须为同一属性,创建向量会经常使用c()
函数。如果c()
函数的参数类型不一致,函数会强制将所有参数变为同一类型,比如:
> c(2, 3, 6)
[1] 2 3 6
> c(2, TRUE, 'hello') ## 全部强制转化为 character
[1] "2" "TRUE" "hello"
> c(2.1, TRUE, 'hello') ## 全部强制转化为 character
[1] "2.1" "TRUE" "hello"
> c(2+3i, TRUE, 'hello') ## 全部强制转化为 character
[1] "2+3i" "TRUE" "hello"
> c(2, TRUE) ## 全部强制转化为 integer
[1] 2 1
> c(2.1, TRUE) ## 全部强制转化为 numeric
[1] 2.1 1.0
> c(2+3i, TRUE) ## 全部强制转化为 complex
[1] 2+3i 1+0i
> c(2, 2.1) ## 全部强制转化为 numeric
[1] 2.0 2.1
> c(2, 2.1, 2+3i) ## 全部强制转化为 complex
[1] 2.0+0i 2.1+0i 2.0+3i
通过上面的对比,我们知道当
c()
函数的参数类型不同时,会强制转化成同一类型;而且每种类型的强弱不一样,强弱顺序为:character > complex > numeric > integer > logical。
2. 向量的基本运算
在讲基本运算前,顺便提一下,单个数(标量)也是一个向量,只不过它的长度为1。我们可以通过is.vector()
函数来验证:
> is.vector(3) ## 单个数也是向量
[1] TRUE
> is.vector(c(2, 3, 5))
[1] TRUE
可以通过
is.vector()
函数来判断变量是否为向量。
来看一些向量基本运算的例子:
2.1 向量的长度相同时
当向量的长度相同时,向量间的运算只不过是对应元素的运算。例如:
> x <- c(1, 3, 5)
> y <- c(4, 3, 2)
> x + y
[1] 5 6 7
> x * y
[1] 4 9 10
> x ^ y
[1] 1 27 25
2.2 向量的长度不同时
当向量的长度不同时,短的向量会自动循环补齐至与长向量相同,然后再运算。来看一些例子:
> x <- c(1, 3)
> y <- c(4, 3, 2, 1)
> z <- c(2, 4, 5)
> x + 4 ## 单个的数值4会被补齐为 c(4, 4)
[1] 5 7
> x - y ## 等价于 c(1, 3, 1, 3) - c(4, 3, 2, 1),因为x会自动补齐为 c(1, 3, 1, 3)
[1] -3 0 -1 2
> x / y ## 等价于 c(1, 3, 1, 3) / c(4, 3, 2, 1),因为x会自动补齐为 c(1, 3, 1, 3)
[1] 0.25 1.00 0.50 3.00
> x / z ## 等价于c(1, 3, 1) / c(2, 4, 5),由于长向量的长度不是短向量长度的倍数,会给出警告信息,不过还是会给出结果
[1] 0.50 0.75 0.20
Warning message:
In x/z : longer object length is not a multiple of shorter object length
自动循环补齐的这种特性只有在R语言中才有!超强的向量运算功能!
2.3 其它基本运算
来看一些例子:
> x <- c(2, 3, 5)
> exp(x)
[1] 7.389056 20.085537 148.413159
> sin(x)
[1] 0.9092974 0.1411200 -0.9589243
> log(x)
[1] 0.6931472 1.0986123 1.6094379
我们可以看到,基本运算函数作用于向量也只是简单地作用于相应元素。
除了上面基本运算外,向量还有点积(内积)操作,用到%*%
运算符,例如:
> x <- c(1, 3, 5)
> y <- c(2, 4, 6)
> x %*% y ## 点积 1*2+3*4+5*6
[,1]
[1,] 44
结果是一个1x1的矩阵,其中只有一个元素44,关于矩阵后续将会介绍。
3. 创建向量的其它方式
除了使用c()
函数来创建向量外,还有另外三种方式:冒号:
运算符、seq()
函数和rep()
函数。下面来分别介绍:
3.1 冒号:
运算符
冒号:
运算符可用来产生等差级数向量,其使用形式为x:y
,其规则为:
当x
当x>y时,将生成 x, x-1, x-2, x-3, ........等差级数,公差为-1,最后的元素≥y
当x和y相同时,将输出只有一个元素的向量,元素就为x
来看一些例子:
> 2:7 ## integer
[1] 2 3 4 5 6 7
> 9:3 ## integer,公差为-1
[1] 9 8 7 6 5 4 3
> 3.14:9 ## real
[1] 3.14 4.14 5.14 6.14 7.14 8.14
> 3:9.3 ## integer
[1] 3 4 5 6 7 8 9
> 3.14:9.3 ## real
[1] 3.14 4.14 5.14 6.14 7.14 8.14 9.14
> 9:3.2 ## integer,公差为-1
[1] 9 8 7 6 5 4
> 7:7
[1] 7
> 3.4:3.4
[1] 3.4
另外,通过冒号:
运算符可以非常简单地产生等比级数向量。比如:
> 2^(0:5) ## 公比为2
[1] 1 2 4 8 16 32
> 2.1^(0:5) ## 公比为2.1
[1] 1.00000 2.10000 4.41000 9.26100 19.44810 40.84101
3.2 seq()
函数
seq()
函数也是用来产生等差级数向量的,其原型为seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),length.out = NULL, along.with = NULL, ...)
。典型用法有:
seq(from, to)
:等价于from:to
运算seq(from, to, by= )
:参数by
设置公差的大小,最后元素≤to值seq(from, to, length.out= )
:参数length.out
设置输出向量的长度,第一个元素为from值,最后元素的值为to,公差由函数自动计算给出
来看一些例子:
> seq(2, 7)
[1] 2 3 4 5 6 7
> seq(11, 3)
[1] 11 10 9 8 7 6 5 4 3
> seq(2.1, 7)
[1] 2.1 3.1 4.1 5.1 6.1
> seq(2, 7, by=1.1) ## 公差为1.1
[1] 2.0 3.1 4.2 5.3 6.4
> seq(2, 7, length.out=8) ## 输出向量的长度为8,第一个元素为2,最后元素为7
[1] 2.000000 2.714286 3.428571 4.142857 4.857143 5.571429 6.285714 7.000000
3.3 rep()
函数
rep()
函数的作用是重复向量中的元素。比如:
> rep(1:4, 2)
[1] 1 2 3 4 1 2 3 4
> rep(1:4, each = 2) ## not the same.
[1] 1 1 2 2 3 3 4 4
> rep(1:4, c(2,2,2,2)) ## same as second.
[1] 1 1 2 2 3 3 4 4
> rep(1:4, c(2,1,2,1))
[1] 1 1 2 3 3 4
> rep(1:4, each = 2, len = 4) ## first 4 only.
[1] 1 1 2 2
> rep(1:4, each = 2, len = 10) ## 8 integers plus two recycled 1's.
[1] 1 1 2 2 3 3 4 4 1 1
> rep(1:4, each = 2, times = 3) ## length 24, 3 complete replications
[1] 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4 1 1 2 2 3 3 4 4
rep()
函数中的参数的意义可以从上面的例子来理解,自己琢磨。
R向量的第二部分内容就讲到这。
如若有遗漏,后期将会添加至本博客。
感谢您的阅读!想了解更多有关R语言技巧,请关注我的微信公众号“R语言和Python学堂”,我将定期更新相关文章。