R语言—使用函数sample进行抽样
在医学统计学或者流行病学里的现场调查、样本选择经常会提到一个词:随机抽样。随机抽样是为了保证各比较组之间均衡性的一个很重要的方法。那么今天介绍的第一个函数就是用于抽样的函数sample:
- > x=1:10
- > sample(x=x)
- [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进行抽样的更多相关文章
- 【R】R语言常用函数
R语言常用函数 基本 一.数据管理vector:向量 numeric:数值型向量 logical:逻辑型向量character:字符型向量 list:列表 data.frame:数据框c:连接为向量或 ...
- R语言table()函数
R语言table()函数比较有用,两个示例尤其是混淆矩阵这个案例比较有用: 例子一:统计频次 z<-c(1,2,2,4,2,7,1,1);z1<-table(z);summary(z1); ...
- R语言封装函数
R语言封装函数 原帖见豆瓣:https://www.douban.com/note/279077707/ 一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分. 1. 函数名称,即要 ...
- R语言笔记002——sample()函数
sample()函数 sample(x,size,replace=FALSE) x表示一个或多个向量,size表示从x中随机取的样本个数,replace=FALSE表示不放回抽样,即不会选取到相同的值 ...
- R语言中函数调试
有时候会用R语言写一下简单的脚本处理函数,加入需要调试的话可以按照下面的步骤进行: fun <- function(x , y){ x + y x - y x * y x / y } debug ...
- R语言常用函数:交集intersect、并集union、找不同setdiff、判断相同setequal
在R语言进行数据分析时,经常需要找不同组间的相同和不同,那你应该掌握如下几个函数,让你事半功倍. 交集intersect两个向量的交集,集合可以是数字.字符串等 # 两个数值向量取交集intersec ...
- .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)
Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...
- R语言plot函数参数合集
最近用R语言画图,plot 函数是用的最多的函数,而他的参数非常繁多,由此总结一下,以供后续方便查阅. plot(x, y = NULL, type = "p", xlim = N ...
- R语言apply()函数用法
在R语言的帮助文档里,apply函数的功能是: Retruns a vector or array or list of values obtained by applying a function ...
随机推荐
- CDN是如何工作的?
CDN的原理非常简单.当浏览器请求一资源时,第一步是做DNS解析,DNS解析就像是从通讯录根据姓名找号码,浏览器发送域名,然后得到DNS服务器返回的IP地址.浏览器通过IP地址和服务器连接并获取资源( ...
- CF使用TGP下载后,分卷文件损坏的解决方法
首先从游戏的列表删除游戏(安装失败出现分卷文件损坏的游戏) 然后进入游戏重新,继续找到该游戏(安装失败的游戏) 点击下载游戏!不会重新下载的,之后下载一些失败的文件,不会花费多少时间,慢慢等待即可 之 ...
- sqler sql 转rest api 源码解析(四)macro 的执行
macro 说明 macro 是sqler 的核心,当前的处理流程为授权处理,数据校验,依赖执行(include),聚合处理,数据转换 处理,sql 执行以及sql 参数绑定 授权处理 这个是通过go ...
- cJSON学习笔记 续集
0.前言 本文试图说明怎样使用CJSON构造各种各样的JSON数据包.在前段时间已经写过一篇cJSON的文章,所以本文成为"续集". [相关博文] [前端学 ...
- Go程序语言设计 (艾伦 A. A. 多诺万 著)
第1章 入门 (已看) 1.1 hello,world package main import "fmt" func main(){ fmt.Println("Hell ...
- Unity5 图形系统介绍 学习
- Primitives vs Objects
这里首先我们要了解什么是primitives 和 objects 其实理解起来很简单. 如果我们懂.NET开发就会知道C#中的值类型和引用类型. primitives variables contai ...
- openstack--3--控制节点安装配置keystone
Keystone介绍 Keystone作用 用户与认证:用户权限与用户行为跟踪: 服务目录:提供一个服务目录,包括所有服务项与相关Api的端点,它是个注册中心 用户认证包括:User,Tenant,T ...
- Spring中时间格式注解@DateTimeFormat
在SpringMVC中Controller中方法参数为Date类型想要限定请求传入时间格式时,可以通过@DateTimeFormat来指定,但请求传入参数与指定格式不符时,会返回400错误. 如果在B ...
- [转]Java对象的序列化和反序列化
一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存 ...