R-例解随机数和随机抽样

2022-05-15  本文已影响0人  睿睿爱汪汪也爱喵喵

问题:

在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)

上一篇下一篇

猜你喜欢

热点阅读