子样本

时间:2017-09-25 15:35:45

标签: r sample tibble createsamples

我想两次从数据集中选择一个样本。实际上,我不想选择它,而是创建一个新的变量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?

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