【问题标题】:R- random sample of groups in a data.tableR- data.table 中组的随机样本
【发布时间】:2018-10-24 11:07:48
【问题描述】:

如何随机抽样,例如data.table 中的三个组,以便结果包含三个组,其中包含原始 data.table 中的所有行?

library(data.table)
dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C", "D", "E", "F"), 20, 
replace=TRUE))

我知道如何从 data.table 中随机选择 10 行:

dat.sampl1 <- as.data.table(sapply(dat[], sample, 10))

以及如何按组采样

dat[,.SD[sample(.N, min(.N,3))], by = groups]

但是如何随机抽样组呢?所以结果应该是这样的:

    ids groups
     1      F
    11      F
     3      F
    18      F
     8      A
     9      A
    10      A
    17      A
    19      A
    12      E
    14      E
    16      E

【问题讨论】:

  • 我不明白你在问什么。如果您要使用sample(),请使用set.seed(),这样您的数据是可重现的。看起来你有一些限制,所以它不是一个简单的随机样本。这可能是某种条件抽样吗?

标签: r data.table


【解决方案1】:

你的意思是这样的:

set.seed(123)
dat <- data.table(ids=1:20, groups=sample(x=c("A","B","C", "D", "E", "F"), 20, 
replace=TRUE))
dat[groups %in% sample(unique(dat[, groups]), size = 3)][order(groups)]
#     ids groups
#  1:   3      C
#  2:  10      C
#  3:  12      C
#  4:   7      D
#  5:   9      D
#  6:  14      D
#  7:   4      F
#  8:   5      F
#  9:   8      F
# 10:  11      F
# 11:  16      F
# 12:  20      F

如果您想对组进行抽样替换,您可以执行以下操作,其中A 已被抽样两次:

dat[unique(dat[, list(groups)])[sample(.N, 3, replace = TRUE)], on = "groups"]
#    ids groups
# 1:   3      C
# 2:  10      C
# 3:  12      C
# 4:   6      A
# 5:  15      A
# 6:  18      A
# 7:   6      A
# 8:  15      A
# 9:  18      A

【讨论】:

  • 完美!那正是我锁定的目标。非常感谢。
  • 很好 - 如果答案解决了您的问题,请接受它,以便我们将问题标记为已解决。
【解决方案2】:

此代码有效,使用一行基本 R 代码,使用 %in% 来检查使用 sample 函数生成的索引:

df1[df1[,'groups'] %in% sample(unique(df1[,'groups']), size = 3, replace = F), ]

例如:

> df1 <- data.frame("ids" = 1:20, "groups" = sample(LETTERS[1:4], size = 20, replace = T))
> df2 <- df1[df1[,'groups'] %in% sample(unique(df1[,'groups']), size = 3, replace = F), ]
> df2[order(df2[,'groups']),]
   ids groups
4    4      B
6    6      B
18  18      B
20  20      B
1    1      C
2    2      C
3    3      C
9    9      C
12  12      C
16  16      C
19  19      C
7    7      D
11  11      D

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多