R-例解随机数和随机抽样
问题:
在2018年的调查中,我们需要对499个样本重新赋值,故从10001到99999的池子中随机抽了499个数,生成了新的随机码;进一步,在2020年,我们同样需要在10001到99999的池子中随机抽100个数,同时这100个数不得与之前的499个数重复。
我们如何利用R语言实现以上需求呢?
思路:
图1 抽样示意图代码与注释:
library(dplyr)
#No.1 建立初始抽样池
stage1<-data.frame(matrix( nrow = 90000, ncol = 1))
stage1[1:90000,1]<-row(stage1)+10000-1
colnames(stage1)<-"V2"
#No.2 从初始抽样池中无放回地抽499个样本
set.seed(499)
test1=as.data.frame(sample(10000:99999,499,replace=FALSE))
colnames(test1)<-"V1"
#No.3 在R中实现EXCEL中的VLOOKUP功能,生成一个单列的数据框,前1至499行储存第1次抽中的样本,后500至90000行存放二阶段抽样池,并左右拼接前三步生成的数据集
stage2<-test1 %>%right_join(stage1, by=c('V1'='V2'))
colnames(stage2)<-"V3"
pool<-data.frame()
pool<-cbind.data.frame(stage1,rbind(test1,matrix( nrow = 89501, ncol = 1)),stage2)
#No.4 将存放数据的数据框的第4列的后500至90000行存放二阶段抽样池,考虑到sample函数的功能,我们新建一列序号列,存放从1到89501的自然序列,作为二阶段抽样池对应的辅助序列
pool[500:90000,4]<-pool[500:90000,3]
pool[500:90000,5]<-pool[500:90000,1]-499
#No.5 在二阶段抽样池的辅助序列中无放回地随机抽200个数,同时利用右连接功能,找出这200个数在二阶段抽样池中对应的样本,即第2次抽样的样本,并将其储存在数据集里。
######set.seed()的含义是设立种子,使得程序可重复,种子数可为任意整数
set.seed(4)
test2=as.data.frame(sample(10000:99500,200,replace=FALSE))
colnames(test2)<-"V6"
test2_true<-test2 %>%right_join(pool[4:5], by=c('V6'='V5'))
pool[500:699,6]<-test2_true[1:200,2]
pool[500:699,7]<-test2_true[1:200,2]
#No.6 合并(上下拼接)第1次抽样和第2次抽样的结果,并生成三阶段抽样池。以后还可以在stage 3的基础上,继续抽样
test2_true1<-as.data.frame(test2_true[1:200,2])
colnames(test1)<-"sam1_2"
colnames(test2_true1)<-"sam1_2"
sample_1_2<-rbind(test1,test2_true1)
stage3<-sample_1_2%>%right_join(hhhh, by=c('sam1_2'='V2'))
pool[8]<-stage3
#No.7 简化池子:第1列为初始抽样池,第2列为第1次抽样完的结果,第3列为第2次抽样完的结果
sampling<-cbind.data.frame(pool[1],pool[3],pool[8])
colnames(sampling)<-c("pool","sample18","sample20")
参考文章:
1、R-例解如何用函数和循环减少代码的重复(for循环和while循环)。链接:R-例解如何用函数和循环减少代码的重复(for循环和while循环) - 简书 (jianshu.com)