子样本的样本

sample of a subsample

我想 select 从数据集中提取一个样本两次。实际上,我不想 select 它,而是要创建一个新变量 sampleNo 来指示一个案例属于哪个样本(一个或两个)。

假设我有一个包含 40 个案例的数据集:

data <- data.frame(var1=seq(1:40), var2=seq(40,1)) 

我画的第一个样本(n=10)是这样的:

data$sampleNo <- 0
idx <- sample(seq(1,nrow(data)), size=10, replace=F)
data[idx,]$sampleNo <- 1

现在,(我的问题从这里开始)我想绘制第二个样本 (n=10)。但是这个样本应该只从不属于第一个样本的案例中抽取。 此外,"var1"应该是偶数。

所以 sampleNo 对于根本没有抽取的案例应该是 0,对于属于第一个样本的案例应该是 1,对于属于第二个样本的案例应该是 2(= sampleNo 等于 0 var1 是偶数)。

我是这样解决的:

idx2<-data$var1%%2 & data$sampleNo==0
sample(data[idx2,], size=10, replace=F)

但是如何将 sampleNo 设置为 2?

我们可以使用setdiff函数如下:

sample(setdiff(1:nrow(data), idx), 3, replace = F)

setdiff(x, y) 将 select x 中不在 y:

中的元素
setdiff(x = 1:20, y = seq(2,20,2))
 [1]  1  3  5  7  9 11 13 15 17 19

所以在上面的例子中包括:

data$sampleNo2 <- 0
idx2 <- sample(setdiff(1:nrow(data), idx), 3, replace = F)
data[idx2,]$sampleNo2 <- 1

这里有一个更符合您最初想法的完整解决方案。代码可以缩短,但现在我尽量让它透明。

# Data
data <- data.frame(var1 = 1:40, var2 = 40:1) 

# Add SampleNo column
data$sampleNo <- 0L

# Randomly select 10 rows as sample 1
pool_idx1 <- 1:nrow(data)
idx1 <- sample(pool_idx1, size = 10)
data[idx1, ]$sampleNo <- 1L

# Draw a second sample from cases where sampleNo != 1 & var1 is even 
pool_idx2 <- pool_idx1[data$var1 %% 2 == 0 & data$sampleNo != 1]
idx2 <- sample(pool_idx2, size = 10)
data[idx2, ]$sampleNo <- 2L