1

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

4

2 回答 2

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
于 2017-09-25T15:42:46.593 回答
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
于 2017-09-25T17:47:33.993 回答