【R】數值型向量及運算

數值型向量

向量是將若干個基礎類型相同的值存儲在一起, 各個元素可以按序號訪問。 如果將若干個數值存儲在一起可以用序號訪問, 就叫做一個數值型向量。

用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 <c(1, 10)
> 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

  1. 把這10個成績存入變量x;
  2. 從小到大排序;
  3. 計算order(x),解釋order(x)結果中第3項代表的意義。
  4. 計算這些成績的平均值、標準差、最小值、最大值、中位數。
  5. 生成區間上等間隔的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章