通过随机选择的参与者ID对纵向数据框进行子集

时间:2016-03-07 09:53:20

标签: r subset random-sample

我希望通过随机抽样的参与者对纵向数据集进行子集化。在这个例子中,每个参与者有三个条目,我想抽样4个参与者。

id <- rep(c(1:6), each = 3)
score <- rnorm(18, 10, 3)
group <- rep(c("a", "b"), each = 3, times = 3)

df <- data.frame(id, group, score)

我试过这个命令......

dfSub <- df[df$id %in% sample(df$id, 4, replace = FALSE),]

但它只返回三个参与者的条目,而不是我规定的四个参赛者。任何人都可以告诉我为什么这不起作用以及如何做得更好?

1 个答案:

答案 0 :(得分:1)

我们可以使用unique

df[df$id %in%sample(unique(df$id), 4, replace = FALSE),]
#   id group     score
#7   3     a  8.123872
#8   3     a 12.685344
#9   3     a 12.824781
#10  4     b 11.868296
#11  4     b 13.000660
#12  4     b  9.541258
#13  5     a  9.722255
#14  5     a  3.889751
#15  5     a 10.851232
#16  6     b 10.945997
#17  6     b 11.632380
#18  6     b  3.289507

由于以下

,OP的命令无法解决
 sample(c(1, 1, 4,3), 3, replace=FALSE)
 #[1] 3 4 1
 sample(c(1, 1, 4,3), 3, replace=FALSE)
 #[1] 1 3 1

如果存在重复值,sample仍然可以为指定的unique返回重复值而不是size值。 replace仅确定是否应该替换采样。在虚拟示例中,我们有2 1s。因此,即使使用replace=FALSEsample中可能的1的数量也是2。