R语言初级教程(10): 向量(中篇)

这篇博客接着讲有关向量的操作,将主要讲:

  • 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学堂”,我将定期更新相关文章。

你可能感兴趣的:(R语言初级教程(10): 向量(中篇))