在医学统计学或者流行病学里的现场调查、样本选择经常会提到一个词:随机抽样。随机抽样是为了保证各比较组之间均衡性的一个很重要的方法。那么今天介绍的第一个函数就是用于抽样的函数sample:

  1. > x= 1:10
  2. > sample(x=x)
  3. [ 1]  3  5  9  6 10  7  2  1  8  4

第一行代码表示给x向量赋值1~10,第二行代码表示对x向量进行随机抽样。结果输出为每次抽样抽得的结果,可以看出该抽样为无放回抽样------最多抽n次,n为x向量中元素的个数。

如果想指定在该向量中抽取元素的个数,需要加一个参数size:

> x=1:1000

> sample(x=x,size=20)

[1]  66 891 606 924 871 374 879 573 284 305 914 792 398 497 721 897 324 437

[19] 901  33

这是在1~1000的正整数中抽样,其中size指定抽样的次数,抽了20次,结果如上所示。

这些都是无放回抽样。所谓无放回抽样,也就是说某个元素一旦被选择,该总体中就不会再有该元素。如果是有放回抽样,则需添加一个参数repalce=T:

> x=1:10

> sample(x=x,size=5,replace=T)

[1] 4 7 2 4 8

“replace”就是重复的意思。即可以重复对元素进行抽样,也就是所谓的有放回抽样。我们看上面的结果,元素4在5次随机抽样的过程中被抽取了两次。

R语言代码有一个特性就是“对位性”,也许我的词不专业,但是它的意思就是:如果我们输入代码的位置与某个函数中参数的位置一一对应的话,我们可以不写该函数的参数,如:

> x=1:10

> sample(x,20,T)

[1] 1 2 2 1 5 5 5 9 9 5 2 9 8 3 4 8 8 8 1 1

在上述代码中我们省略了参数x,size和repalce,但是仍然可以运算并且表示对x向量有放回随机抽取20次。我们之所以尽量在每次编写代码时带上参数是因为我觉得这个习惯比较好,而且看起来清楚明白。另外,省略参数的前提是你非常熟悉某个函数参数的位置,否则一旦没有“对位”,那么结果肯定是错误的。而且很多函数有较多的参数,想记住它们的位置是困难的。而如果带上参数,那么即使位置不对应,也一样可以运算:

> x=1:10

> sample(size=20,replace=T,x=x)

[1]  4  9  2  6  4  5  4  7 10  5  2  2  3  4  2  4  6  8  7  8

这种优点显而易见,不仅清楚,而且无需对应。另外我们也可以看出,有放回抽样的话size可以无穷大,而无放回抽样size的大小就取决于总体的容量了。

对于掷骰子,投硬币(这可能是介绍抽样必介绍的内容),都属于有放回抽样。

这里要说明,对于sample函数,参数x可以是数值,也可以是字符,实际上参数x代表任意一个向量:

> a=c("A","B")

> sample(x=a,size=10,replace=T)

[1] "B" "A" "A" "A" "B" "A" "A" "B" "A" "A"

上述代码可以理解为掷硬币,抛了10次,其中正面(A)与反面(B)出现的次数。

上述抽样过程,每一个元素被抽取的概率相等,称为随机抽样。

有时候我们的抽取元素的概率未必相等(如常见的二项分布概率问题),此时我们需要添加一个参数prob,也就是“probability”(概率)的缩写。假设一名医生给患者做某手术成功的概率是80%,那么现在他给20例病人做手术,可能有哪几次是成功的呢?代码如下:

> x=c("S","F")

> sample(x,size=20,replace=T,prob=c(0.8,0.2))

[1] "F" "S" "S" "S" "S" "S" "S" "S" "S" "S" "S" "S" "F" "S" "S" "F" "S" "S"

[19] "F" "S"

其中“S”代表成功,“F”代表失败。

> x=c(1,3,5,7)

> sample(x,size=20,replace=T,prob=c(0.1,0.2,0.3,0.9))

[1] 3 5 7 3 7 3 7 5 3 7 7 7 1 5 7 5 7 7 3 7

这些代码告诉我们,对每一个元素都可以给定一个概率,且每个概率是独立的,即在参数prob中,不一定所有元素的概率加起来等于1,它只代表某元素被抽取的概率而已。

对于sample函数,其参数x可以是R中任意一个对象(如上述对字符的抽样)。其中还有一个功能相同的函数sample.int,“int”即“intger”的缩写,也就是“整数”。它的参数n必须是正整数:

> x=-10.5:7.5

> sample(x=x,size=3);sample.int(n=x,size=3)

[1] -5.5 -7.5  0.5

Error in sample.int(x, size = 3) : invalid first argument

第一行代码生成了-10.5到7.5的等差数列,结果输出的第一行是sample的结果;第二行是sample.int的结果,提示错误:“第一个自变量无效”,因为它不是正整数。其余的用法与sample是一样的。

接下来介绍第二个函数max/min,以及pmax/pmin。

> x=sample(1:1000,size=20)

> x

[1] 514 164 107 354 719 317 204 372 714 522 900 635 441  7  230 653 420 804

[19] 817  36

> max(x);min(x)

[1] 900

[1] 7

从1:1000中随机抽取了20个数,并得出它们的最大值和最小值。如果有缺失值,那么需要一个参数na.rm=T,即移除缺失值,这在前面的mean函数中已经介绍过了:

> x=c(x,NA)

> mean(x);mean(x,na.rm=T);max(x);max(x,na.rm=T);min(x);min(x,na.rm=T)

[1] NA

[1] 446.5

[1] NA

[1] 900

[1] NA

[1] 7

第一行代码我们给原来的向量x添加了一个缺失值“NA”,第二行代码及结果分别显示了在计算x的均值、最大值、最小值时是否带参数na.rm=T的情况。

> x=sample(1:1000,size=20)

> y=sample(1:1000,size=20)

> x;y

[1] 596 333 401 746 970 121 665 831 853 741 855  99 331 275 286 370 558 373

[19]  55 786

[1] 291 360 964 173 497 553 155  34 488  29 661 736 591 602 548 527 450 416

[19] 596 965

这行代码我们对1:1000分别进行20次无放回随机性抽样得到向量x和y。

> pmax(x,700)

[1] 700 700 700 746 970 700 700 831 853 741 855 700 700 700 700 700 700 700

[19] 700 786

> pmin(y,700)

[1] 291 360 700 173 497 553 155  34 488  29 661 700 591 602 548 527 450 416

[19] 596 700

第一个代码表示用700和x向量中的每一个元素进行比较,将每次比较结果较大者输出。

第二个代码表示用700和y向量中的每一个元素进行比较,将每次比较结果较小者输出。

这就是pmax/pmin的用法,p在这里表示“parallel”,可以理解为对向量做平行比较。

> pmax(x,y)

[1] 596 360 964 746 970 553 665 831 853 741 855 736 591 602 548 527 558 416

[19] 596 965

该结果显示了将x向量与y向量中的每个元素平行比较后得出的较大值的结果。如第一个元素的比较,x为596,y为291,所以结果输出为596;第二个元素比较,x向量为333,y向量为360,因此输出结果为360。后面的结果也是一样。

因为x向量与y向量是等长的,所以我们可以对x与y每一个元素进行平行比较。因为R中向量运算时具有“循环原则”,所以在上面的例子中我们也可以用x或y向量与一个元素“700”比较(相当于包含一个元素“700”的向量重复了20次)。

如果循环完整,那么较短向量中的元素依次与较长向量中的元素进行比较

> x=c(1,3,5,7)

> y=c(4,6)

> pmax(x,y)

[1] 4 6 5 7

结果解释:第一个是1与4比较的最大值,第二个是3与6比较的最大值,第三个是5与4比较的最大值,最后一个是7与6比较的最大值。如果循环不完整,自然会出现警告,但输出结果依然是各元素依次平行比较的结果:

> x=c(1,3,5,7,9)

> y=c(4,6)

> pmax(x,y)

[1] 4 6 5 7 9

Warning message:

In pmax(x, y) : an argument will be fractionally recycled

警告的内容是:自变量将部分循环。

对于函数pmax/pmin,也有参数na.rm=T,用法是一样的。同时有对应的pmax.int/pmn.int,也就是比较向量内的元素必须是整数。

接下来给大家介绍今天的最后一个函数length,即查看某一对象的长度。

> x=c(1,3,5,7,9,11)

> y=c("a","b","c")

> z=matrix(1:12,nrow=3)

> a=cbind(x,y)

> length(x);length(y);length(z);length(a)

[1] 6

[1] 3

[1] 12

[1] 12

结果告诉我们向量x的长度是6,向量y的长度是3,矩阵z的长度是12(3×4)。以列结合的对象a的长度为12(6×2)。

对于数据框,其长度为列的长度:

> x=1:5

> y=6:10

> z=7:11

> d=data.frame(x,y,z)

> length(d)

[1] 3

函数length也可以“反向使用”,即对于已知向量,先给定其长度然后输出结果:

> x=1:20

> length(x)=12

> x

[1]  1  2  3  4  5  6  7  8  9 10 11 12

X向量的真实长度为20,但我们输出长度为12的x向量。

R语言—使用函数sample进行抽样相关推荐

  1. R语言 自定义函数之趣味程序--老虎机

    ****R语言 自定义函数之趣味程序--老虎机**** 自定义函数 自定义规则 自定义格式 案例:老虎机 老虎机符号准备 老虎机结果分类 老虎机得分计算 开始老虎机试玩 获奖感言 自定义函数 R语言作 ...

  2. c r语言中rank函数,R语言rank函数详细解析

    R语言rank函数详细解析 发布于 2016-01-04 16:26:04 | 557 次阅读 | 评论: 0 | 来源: PHPERZ R 数据统计分析语言R是用于统计分析.绘图的语言和操作环境.R ...

  3. R语言which函数详解以及Rcpp改写

    R语言which函数详解以及Rcpp的改写 引言 which 函数的介绍 which函数的一些小例子 1 2 which函数的改进以及时间对比 引言 首先来介绍一下R语言which函数的作用:whic ...

  4. R语言str_trim函数去除字符串中头部和尾部的空格

    R语言str_trim函数去除字符串中头部和尾部的空格 目录 R语言str_trim函数去除字符串中头部和尾部的空格 #导入包和库 #仿

  5. R语言sqrt函数为数值开平方根实战

    R语言sqrt函数为数值开平方根实战 目录 R语言sqrt函数为数值开平方根实战 #基本语法 #sqrt函数开平方根

  6. R语言数学函数:abs绝对值、sqrt平方根、ceiling向上近似整数、floor向下近似整数、trunc去除小数部分、round近似到指定小数位、signif近似到有效数字、三角函数、指数、对数

    R语言数学函数:abs绝对值.sqrt平方根.ceiling向上近似整数.floor向下近似整数.trunc去除小数部分.round近似到指定小数位.signif近似到有效数字.三角函数.指数.对数 ...

  7. R语言sd函数计算数值标准差实战(Standard Deviation)

    R语言sd函数计算数值标准差实战(Standard Deviation) 目录 R语言sd函数计算数值标准差实战(Standard Deviation) #基本语法 #sd

  8. R语言optimize函数一维优化实战

    R语言optimize函数一维优化实战 目录 R语言optimize函数一维优化实战 #基础语法 #优化用户自定义的函数

  9. R语言rev函数对数据对象(向量、dataframe通过行或者列)反序实战

    R语言rev函数对数据对象(向量.dataframe通过行或者列)反序实战 目录 R语言rev函数对数据对象(向量.dataframe通过行或者列)反序实战

最新文章

  1. mysql]ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value
  2. 定位技术GPS/A-GPS/LBS/WIFI定位介绍
  3. 现代IM系统中的消息系统架构 - 模型篇
  4. Python 公众号 小程序抓包分析
  5. Linux命令(4):cat命令
  6. Java文件能编译成lib吗_Makefile用于将一些.cpp和.h编译成lib
  7. linux c通过文件描述符以及write和read方法对文件进行读写
  8. ad09只在一定范围内查找相似对象_23、面向对象编程
  9. asp.net的MessageBox
  10. JAVA:贪吃蛇源代码
  11. 485不用双绞线可以吗_刘兴亮丨有了北斗,中国可以不用GPS吗
  12. stm32读取驾驶模拟器数据 stm32F407读取joystick数据
  13. kong 自建一个具有健康检查功能的http/tcp负载均衡器,配置流量权重,自动/手动目标健康,流量统一认证、鉴权、限流限速、修正,监控、日志等功能
  14. 使用Delphi创建,解析,操纵XML文档
  15. Flask实现个人博客系统(附源码)
  16. 计算机及网络方面的杂志,计算机类省级期刊
  17. 无线路由器DNS服务器解析,路由器DNS劫持简单实现和防范分析
  18. Vue CLI构建SPA项目教你手把手创建SPA项目
  19. BZOJ.4598.[SDOI2016]模式字符串(点分治 Hash)
  20. AMESim锂离子电池包电化学机理模型

热门文章

  1. Linux ndk编译 报错 bits/c++configure.h is not found
  2. 博图v17 资源再度更新,支持CFC
  3. 今年行情这么差,到底如何进大厂?
  4. 小波分析遇到生成的文件.mat文件加载不出来
  5. 蛋白组学ITRAQ、TMT技术
  6. 自动抢红包,点赞朋友圈,AccessibilityService解放你的双手
  7. PHP codeigniter框架
  8. Ubuntu下tomcat的安装
  9. 使用DL模型预测台风/雷达回波/降水的datasets构建学习笔记
  10. HTML5笔记+案例