数值型向量
向量是将若干个基础类型相同的值存储在一起, 各个元素可以按序号访问。 如果将若干个数值存储在一起可以用序号访问, 就叫做一个数值型向量。
用c()函数把多个元素或向量组合成一个向量。如
> marks <- c(10, 6, 4, 7, 8)
> x <- c(1:3, 10:13)
> x1 <- c(1, 2)
> x2 <- c(3, 4)
> x <- c(x1, x2)
> x
运行结果
## [1] 1 2 3 4
10:13这样的写法表示从10到13的整数组成的向量。
用print()函数显示向量或在命令行中显示向量时, 每行显示的行首会有方括号和数字序号, 代表该行显示的第一个向量元素的下标。如
> 12345678901:12345678920
运行结果:
## [1] 12345678901 12345678902 12345678903 12345678904 12345678905 12345678906
## [7] 12345678907 12345678908 12345678909 12345678910 12345678911 12345678912
## [13] 12345678913 12345678914 12345678915 12345678916 12345678917 12345678918
## [19] 12345678919 12345678920
length(x)可以求x的长度。 长度为零的向量表示为numeric(0)。 numeric()函数可以用来初始化一个指定元素个数而元素都等于零的数值型向量, 如numeric(10)会生成元素为10个零的向量。
> x <- numeric(10)
> x
## [1] 0 0 0 0 0 0 0 0 0 0
向量运算
标量和标量运算
单个数值称为标量, R没有单独的标量类型, 标量实际是长度为1的向量。
R中四则运算用+ - * / ^表示(加、减、乘、除、乘方),如
> 1.5 + 2.3 - 0.6 + 2.1*1.2 - 1.5/0.5 + 2^3
## [1] 10.72
R中四则运算仍遵从通常的优先级规则, 可以用圆括号()改变运算的先后次序。 如
> 1.5 + 2.3 - (0.6 + 2.1)*1.2 - 1.5/0.5 + 2^3
## [1] 5.56
除了加、减、乘、除、乘方, R还支持整除运算和求余运算。 用%/%表示整除,用%%表示求余。如
> 5 %/% 3
## [1] 1
> 5 %% 3
## [1] 2
> 5.1 %/% 2.5
## [1] 2
> 5.1 %% 2.5
## [1] 0.1
向量与标量运算
向量与标量的运算为每个元素与标量的运算, 如
> x x + 2
## [1] 3 12
> x - 2
## [1] -1 8
> x * 2
## [1] 2 20
> x / 2
## [1] 0.5 5.0
x ^ 2
## [1] 1 100
2 / x
## [1] 2.0 0.2
2 ^ x
## [1]2 1024
一个向量乘以一个标量, 就是线性代数中的数乘运算。
四则运算时如果有缺失值,缺失元素参加的运算相应结果元素仍缺失。 如
> c(1, NA, 3) + 10
## [1] 11 NA 13
等长向量运算
等长向量的运算为对应元素两两运算。 如
> x1 <- c(1, 10)
> x2 <- c(4, 2)
> x1 + x2
## [1] 5 12
> x1 - x2
## [1] -3 8
> x1 * x2
## [1] 4 20
> x1 / x2
## [1] 0.25 5.00
两个等长向量的加、减运算就是线性代数中两个向量的加、减运算。
不等长向量的运算
两个不等长向量的四则运算, 如果其长度为倍数关系,规则是每次从头重复利用短的一个。 如
> x1 <- c(10, 20)
> x2 <- c(1, 3, 5, 7)
> x1 + x2
## [1] 11 23 15 27
> x1 * x2
## [1] 10 60 50 140
不仅是四则运算,R中有两个或多个向量按照元素一一对应参与某种运算或函数调用时, 如果向量长度不同,一般都采用这样的规则。
如果两个向量的长度不是倍数关系,会给出警告信息。如
c(1,2) + c(1,2,3)
## Warning in c(1, 2) + c(1, 2, 3): 长的对象长度不是短的对象长度的整倍数
## [1] 2 4 4
向量函数
向量化的函数
R中的函数一般都是向量化的: 在R中, 如果普通的一元函数以向量为自变量,一般会对每个元素计算。 这样的函数包括sqrt, log10, log, exp, sin, cos, tan等许多。 如
> sqrt(c(1, 4, 6.25))
## [1] 1.0 2.0 2.5
为了查看这些基础的数学函数的列表,运行命令help.start(), 点击链接“Search Engine and Keywords”, 找到“Mathematics”栏目, 浏览其中的“arith”和“math”链接中的说明。 常用的数学函数有:
- 舍入:ceiling, floor, round, signif, trunc, zapsmall
- 符号函数 sign
- 绝对值 abs
- 平方根 sqrt
- 对数与指数函数 log, exp, log10, log2
- 三角函数 sin, cos, tan
- 反三角函数 asin, acos, atan, atan2
- 双曲函数 sinh, cosh, tanh
- 反双曲函数 asinh, acosh, atanh
有一些不太常用的数学函数:
- 贝塔函数 beta, lbeta
- 伽玛函数 gamma, lgamma, digamma, trigamma, tetragamma, pentagamma
- 组合数 choose, lchoose
- 富利叶变换和卷积 fft, mvfft, convolve
- 正交多项式 poly
- 求根 polyroot, uniroot
- 最优化 optimize, optim
- Bessel函数 besselI, besselK, besselJ, besselY
- 样条插值 spline, splinefun
- 简单的微分 deriv
如果自己编写的函数没有考虑向量化问题, 可以用Vectorize()函数将其转换成向量化版本。
排序函数
sort(x)返回排序结果。 rev(x)返回把各元素排列次序反转后的结果。 order(x)返回排序用的下标。如
> x <- c(33, 55, 11)
> sort(x)
## [1] 11 33 55
> rev(sort(x))
## [1] 55 33 11
> order(x)
## [1] 3 1 2
> x[order(x)]
## [1] 11 33 55
例子中, order(x)结果中3是x的最小元素11所在的位置下标, 1是x的第二小元素33所在的位置下标, 2是x的最大元素55所在的位置下标。
统计函数
sum(求和), mean(求平均值), var(求样本方差), sd(求样本标准差), min(求最小值), max(求最大值), range(求最小值和最大值)等函数称为统计函数, 把输入向量看作样本,计算样本统计量。 prod求所有元素的乘积。
cumsum和cumprod计算累加和累乘积。如
> cumsum(1:5)
## [1] 1 3 6 10 15
> cumprod(1:5)
## [1] 1 2 6 24 120
其它一些类似函数有pmax, pmin, cummax, cummin等。
练习
1. 显示1到100的整数的平方根和立方根(提示:立方根就是三分之一次方)。
计算平方根
> sqrt(seq(1:100))
[1] 1.000000 1.414214 1.732051 2.000000 2.236068 2.449490 2.645751 2.828427
[9] 3.000000 3.162278 3.316625 3.464102 3.605551 3.741657 3.872983 4.000000
[17] 4.123106 4.242641 4.358899 4.472136 4.582576 4.690416 4.795832 4.898979
[25] 5.000000 5.099020 5.196152 5.291503 5.385165 5.477226 5.567764 5.656854
[33] 5.744563 5.830952 5.916080 6.000000 6.082763 6.164414 6.244998 6.324555
[41] 6.403124 6.480741 6.557439 6.633250 6.708204 6.782330 6.855655 6.928203
[49] 7.000000 7.071068 7.141428 7.211103 7.280110 7.348469 7.416198 7.483315
[57] 7.549834 7.615773 7.681146 7.745967 7.810250 7.874008 7.937254 8.000000
[65] 8.062258 8.124038 8.185353 8.246211 8.306624 8.366600 8.426150 8.485281
[73] 8.544004 8.602325 8.660254 8.717798 8.774964 8.831761 8.888194 8.944272
[81] 9.000000 9.055385 9.110434 9.165151 9.219544 9.273618 9.327379 9.380832
[89] 9.433981 9.486833 9.539392 9.591663 9.643651 9.695360 9.746794 9.797959
[97] 9.848858 9.899495 9.949874 10.000000
#计算立方根
> sqrtn <- function(x,n) x^(1/n)
> sqrtn(seq(1:100),3)
[1] 1.000000 1.259921 1.442250 1.587401 1.709976 1.817121 1.912931 2.000000 2.080084
[10] 2.154435 2.223980 2.289428 2.351335 2.410142 2.466212 2.519842 2.571282 2.620741
[19] 2.668402 2.714418 2.758924 2.802039 2.843867 2.884499 2.924018 2.962496 3.000000
[28] 3.036589 3.072317 3.107233 3.141381 3.174802 3.207534 3.239612 3.271066 3.301927
[37] 3.332222 3.361975 3.391211 3.419952 3.448217 3.476027 3.503398 3.530348 3.556893
[46] 3.583048 3.608826 3.634241 3.659306 3.684031 3.708430 3.732511 3.756286 3.779763
[55] 3.802952 3.825862 3.848501 3.870877 3.892996 3.914868 3.936497 3.957892 3.979057
[64] 4.000000 4.020726 4.041240 4.061548 4.081655 4.101566 4.121285 4.140818 4.160168
[73] 4.179339 4.198336 4.217163 4.235824 4.254321 4.272659 4.290840 4.308869 4.326749
[82] 4.344481 4.362071 4.379519 4.396830 4.414005 4.431048 4.447960 4.464745 4.481405
[91] 4.497941 4.514357 4.530655 4.546836 4.562903 4.578857 4.594701 4.610436 4.626065
[100] 4.641589
2. 设有10个人的小测验成绩为:
77 60 91 73 85 82 83 100 66 75
- 把这10个成绩存入变量x;
- 从小到大排序;
- 计算order(x),解释order(x)结果中第3项代表的意义。
- 计算这些成绩的平均值、标准差、最小值、最大值、中位数。
- 生成区间上等间隔的100个格子点存入变量x中。
解答:
> x <- c(77,60,91,73,85,82,83,100,66,75)
> sort(x)
[1] 60 66 73 75 77 82 83 85 91 100
> order(x)
[1] 2 9 4 10 1 6 7 5 3 8
#第三项为4,指代的是按从小到大排序的话排第三位的是之前排第4位的数字,即75
> mean(x)
[1] 79.2
> sd(x)
[1] 11.69805
> min(x)
[1] 60
> max(x)
[1] 100
> median(x)
[1] 79.5
#产生100个【0,1】之间的浮点数
> x <- seq(0,1,length.out = 100)
> x
[1] 0.00000000 0.01010101 0.02020202 0.03030303 0.04040404 0.05050505 0.06060606
[8] 0.07070707 0.08080808 0.09090909 0.10101010 0.11111111 0.12121212 0.13131313
[15] 0.14141414 0.15151515 0.16161616 0.17171717 0.18181818 0.19191919 0.20202020
[22] 0.21212121 0.22222222 0.23232323 0.24242424 0.25252525 0.26262626 0.27272727
[29] 0.28282828 0.29292929 0.30303030 0.31313131 0.32323232 0.33333333 0.34343434
[36] 0.35353535 0.36363636 0.37373737 0.38383838 0.39393939 0.40404040 0.41414141
[43] 0.42424242 0.43434343 0.44444444 0.45454545 0.46464646 0.47474747 0.48484848
[50] 0.49494949 0.50505051 0.51515152 0.52525253 0.53535354 0.54545455 0.55555556
[57] 0.56565657 0.57575758 0.58585859 0.59595960 0.60606061 0.61616162 0.62626263
[64] 0.63636364 0.64646465 0.65656566 0.66666667 0.67676768 0.68686869 0.69696970
[71] 0.70707071 0.71717172 0.72727273 0.73737374 0.74747475 0.75757576 0.76767677
[78] 0.77777778 0.78787879 0.79797980 0.80808081 0.81818182 0.82828283 0.83838384
[85] 0.84848485 0.85858586 0.86868687 0.87878788 0.88888889 0.89898990 0.90909091
[92] 0.91919192 0.92929293 0.93939394 0.94949495 0.95959596 0.96969697 0.97979798
[99] 0.98989899 1.00000000