【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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345