0

我是 R 的新手,所以请耐心等待。

所以我试图以这样一种方式执行分层抽样,它将使用 2 列地层,但两列都满足特定值。

这是我的代码:

library(splitstackshape)
set.seed(1)
dat1 <- data.frame(ID = 1:100,
                   A = sample(c("AA", "BB", "CC", "DD", "EE"), 100, replace = TRUE),
                   B = sample(c(30,40,50),100,replace = TRUE), C = sample(c(1:10),100,replace = TRUE),
                   D = sample(c("CA", "NY", "TX"), 100, replace = TRUE),
                   E = sample(c("M", "F"), 100, replace = TRUE))

stratified(dat1, c("B", "C"), 0.1, select = list(B = 30, C = c(8:10)))

据我了解,此函数首先生成大小为 10% 的层,然后从中选择满足条件 B=30 和 c 介于 8 到 10 之间的那些记录。

结果,地层的大小从最初的 10% 减少了。

我的问题是,有没有什么方法可以生成一个分层,该分层由其中 B 列的值为 30 而 C 列的值在 8 到 10 之间的记录组成nrow()结果样本的值为原始数据的 10%框架?

我正在使用stratified()“splitstackshape”。如果stratified()无法处理,是否还有其他可以执行此类操作的软件包?

4

2 回答 2

1

更新

继续原始答案中的示例数据,我将使用两步过程:

  1. 使用您感兴趣的级别创建一个子集。

    sub1 <- as.data.table(dat1)[B == 30 & C %in% 8:10][order(C)]
    
  2. 找出你需要采样的百分比。在这里,我将最终行数设置为 500,因为在获取子集时样本数据没有 1000 行。要获得所需的百分比,它就像所需的行数除以子集中的总行数一样简单......

    rows_wanted <- 500
    set.seed(2)
    out <- stratified(sub1, "C", rows_wanted/nrow(sub1))
    
    ## Check how many rows we have per group
    out[, .N, .(B, C)]
    #     B  C   N
    # 1: 30  8 157
    # 2: 30  9 169
    # 3: 30 10 174
    

原始答案

stratified函数首先过滤数据,然后进行采样。考虑以下:

library(splitstackshape)
set.seed(1)
n <- 10000
dat1 <- data.frame(ID = sequence(n),
                   A = sample(c("AA", "BB", "CC", "DD", "EE"), n, replace = TRUE),
                   B = sample(c(30,40,50),n,replace = TRUE), 
                   C = sample(c(1:10),n,replace = TRUE),
                   D = sample(c("CA", "NY", "TX"), n, replace = TRUE),
                   E = sample(c("M", "F"), n, replace = TRUE))

示例,如您所示。

mySample <- stratified(dat1, c("B", "C"), 0.1, select = list(B = 30, C = 8:10))
nrow(mySample)
# [1] 98

将其与输出中应预期的行数进行比较:

as.data.table(dat1)[, .N, .(B, C)][B == 30 & C %in% 8:10, list(N = round(N * .1)), .(B, C)][order(C)]
#     B  C  N
# 1: 30  8 31
# 2: 30  9 33
# 3: 30 10 34

并将上述内容与您从该stratified功能中获得的内容进行比较。

mySample[, .N, .(B, C)]
#     B  C  N
# 1: 30  8 31
# 2: 30  9 33
# 3: 30 10 34
于 2017-09-07T14:17:58.780 回答
0

使用您的数据,这似乎是不可能的,至少如果您在没有更换的情况下进行抽样的话。

idx <- which((dat1$B == 30) & (dat1$C %in% 8:10))
idx <- sample(idx, 0.1*nrow(dat1))

sample.int(length(x), size, replace, prob) 中的错误:
当“replace = FALSE”时,样本不能大于总体

问题是验证这两个条件的行数少于数据的 10%。该向量idx的长度仅为 5。

idx
#[1] 15 18 43 60 93

dat1[idx, ]
#   ID  A  B  C  D E
#15 15 DD 30  9 CA F
#18 18 EE 30 10 NY M
#43 43 DD 30 10 NY F
#60 60 CC 30 10 NY M
#93 93 DD 30 10 TX M
于 2017-09-07T13:52:46.853 回答