我想两次从数据集中选择一个样本。实际上,我不想选择它,而是创建一个新的变量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)。但是这个样本应该从不属于第一个样本的案例中抽取。 此外,&#34; var1&#34;应该是偶数。
因此,sampleNo
对于未完全绘制的情况应为0,对于属于第一个样本的情况应为1,对于属于第二个样本的情况应为2(= sampleNo
等于0和{ {1}}是偶数)。
我试图像这样解决它:
var1
但是如何将idx2<-data$var1%%2 & data$sampleNo==0
sample(data[idx2,], size=10, replace=F)
设置为2?
答案 0 :(得分:3)
我们可以使用setdiff
函数,如下所示:
sample(setdiff(1:nrow(data), idx), 3, replace = F)
setdiff(x, y)
会选择不在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
答案 1 :(得分: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