【问题标题】:Subsetting Longitudinal Dataframe by Randomly Selected Participant ID通过随机选择的参与者 ID 子集纵向数据帧
【发布时间】:2016-03-07 09:53:19
【问题描述】:

我想通过随机抽样的参与者数量对纵向数据集进行子集化。在此示例中,每个参与者有 3 个条目,我想对 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),]

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

【问题讨论】:

    标签: r subset random-sample


    【解决方案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 仍然可以返回重复值,而不是指定 sizeunique 值。 replace 只说明是否应该更换采样。在虚拟示例中,我们有 2 个1s。因此,即使使用replace=FALSEsample 中可能出现的 1 数量也是 2。

    【讨论】:

    • 谢谢@akrun,但我不确定我是否真的明白。我已经尝试了几次我的旧命令,有时它返回 4 x 3 条目,有时它返回三个。你是说我的命令可以返回的最小值是 2 x 3,因为没有“唯一”规定,它可以随机选择 1、1、1、3 或 2、2、2、6 或 5、2、5, 5等?如果是这样,那是有道理的。
    • @llewmils 正如我所提到的,replacement=FALSE 将确保您不会有 4 个 1,如果重复的初始数量只有 3 个并且选择的 size 是 4 个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多