子样本的样本
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
我想 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