今天介绍一些运算函数,它们的使用很简单,没有什么难度,但是也会用的着。

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

> x=1:10

> sample(x=x)

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

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

如果想指定在该向量中抽取元素的个数,需要加一个参数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次随机抽样的过程中被抽取了两次。

如果我们输入代码的位置与某个函数中参数的位置一一对应的话,我们可以不写该函数的参数,如:

> 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的结果,提示错误:“第一个自变量无效”,因为它不是正整数。其余的用法与ample是一样的。

R中的sample函数的更多相关文章

  1. R中的par()函数的参数

    把R中par()函数的主要参数整理了一下(另外本来还整理了每个参数的帮助文档中文解释,但是太长,就分类之后,整理为图表,excel不便放上来,就放了这些表的截图)

  2. 你真的懂了R中的stem函数是如何绘制茎叶图的么?

    本文原创,转载请注明出处,本人Q1273314690(交流学习)   哭晕 你真的学会了stem()函数了吗? stem()函数的使用方法是: stem(x, scale=1,width=80, at ...

  3. R中apply等函数用法[转载]

    转自:https://www.cnblogs.com/nanhao/p/6674063.html 1.apply函数——对矩阵 功能是:Retruns a vector or array or lis ...

  4. R中的sub替换函数【转】

    R中的grep.grepl.sub.gsub.regexpr.gregexpr等函数都使用正则表达式的规则进行匹配.默认是egrep的规则,也可以选用Perl语言的规则.在这里,我们以R中的sub函数 ...

  5. 【翻译】R 中的设计模式

    目录 R 中的设计模式 不动点算法 包装器模式 接口模式 柯里化(Currying) 闭包(Closures) 缓存模式 计数器模式 R 中的设计模式 本文翻译自 Design Patterns in ...

  6. python 和 R 中的整数序列

    python 中的 range() 函数是很常用的,R  中相应的函数是 seq(), 其实,R 中的“ :”也能代替 python 中的 range() 函数. 1.生成升序整数序列 python: ...

  7. R中的name命名系列函数总结

    本文原创,转载请注明出处,本人Q1273314690 R中关于给行列赋名称的函数有 dimnames,names,rowname,colname,row.names 这五个函数,初学的时候往往分不清楚 ...

  8. 总结——R中查看属性的函数

    本文原创,转载注明出处,本人Q1273314690 R中知道一个变量的主要内容和结构,对我们编写代码是很重要的,也可以帮我们避免很多错误. 但是,R中有好几个关于属性查看的函数,我们往往不知道什么时候 ...

  9. R中的apply族函数和多线程计算

    一.apply族函数 1.apply  应用于矩阵和数组 # apply # 1代表行,2代表列 # create a matrix of 10 rows x 2 columns m <- ma ...

随机推荐

  1. 170720、springboot编程之properties文件讲解

    但是在实际开发过程中有更复杂的需求,我们在对properties进一步的升华.在本篇博客中您将会学到如下知识(这节中有对之前的知识的温故,对之前的升华): (1) 在application.prope ...

  2. yii2 的 Url::to() 和 Url::toRoute()

    关于Url类的操作在这个页面http://www.yiichina.com/doc/guide/2.0/helper-url: Url::to() 和 toRoute() 非常类似.这两个方法的唯一区 ...

  3. 南京网络赛E-AC Challenge【状压dp】

    Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...

  4. vs 开发常用快捷键

    alt+shift+enter    编辑区最大化ctrl+]        括号匹配 ctrl+j        强迫智能感知ctrl+shift+空格    强迫智能感知(参数) ctrl+k+d ...

  5. Linux服务器报错too many open files错误解决方案

    1.本质解决方案按照oracle的安装脚本中以下几项文件进行相应配置: cp /etc/security/limits.conf /etc/security/limits.conf.bak echo ...

  6. 利用gulp解决微信浏览器缓存问题

    做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...

  7. JS原生ajax

    原文链接:http://caibaojian.com/ajax-jsonp.html 一.JS原生ajax ajax:一种请求数据的方式,不需要刷新整个页面: ajax的技术核心是 XMLHttpRe ...

  8. SDL结合QWidget的简单使用说明(2)

    上篇主要讲了针对yv12流数据的渲染,但有时候我们显示视频还要求加一些信息,比如头像,昵称等等.一般的想法是在渲染窗口之上做一个小控件来负责: 但是很遗憾,你会发现你的控件被SDL的渲染完全遮住了,渲 ...

  9. Qt::QWidget 无默认标题栏边框的拖拽修改大小方式

    开发环境:win10+vs2015+qt5.9.1 背景:开发过程中,一般很少会使用系统提供的标题栏和边框:往往都是自定义一个自己设计的方案.这时候在QWidget中需要加上flag:Qt::Fram ...

  10. importlib模块与__import__详解

    importlib模块与__import__都可以通过过字符串来导入另外一个模块,但在用法上和本质上都有很大的不同. 通过下面示例说明,有如下一个工程目录: name = 'test' def get ...