分层抽样在因素上的应用

7
我可以帮您进行翻译。这段文字的意思是:我有一个包含1000行数据的数据集,其结构如下:
     device geslacht leeftijd type1 type2
1       mob        0       53     C     3
2       tab        1       64     G     7
3        pc        1       50     G     7
4       tab        0       75     C     3
5       mob        1       54     G     7
6        pc        1       58     H     8
7        pc        1       57     A     1
8        pc        0       68     E     5
9        pc        0       66     G     7
10      mob        0       45     C     3
11      tab        1       77     E     5
12      mob        1       16     A     1

我想制作一个包含80行的样本,由10行type1 = A,10行type1 = B等组成。有人可以帮忙吗?

3个回答

11

以下是我使用data.table的方法:

library(data.table)
indx <- setDT(df)[, .I[sample(.N, 10, replace = TRUE)], by = type1]$V1
df[indx]
#     device geslacht leeftijd type1 type2
#  1:    mob        0       45     C     3
#  2:    mob        0       53     C     3
#  3:    tab        0       75     C     3
#  4:    mob        0       53     C     3
#  5:    tab        0       75     C     3
#  6:    mob        0       45     C     3
#  7:    tab        0       75     C     3
#  8:    mob        0       53     C     3
#  9:    mob        0       53     C     3
# 10:    mob        0       53     C     3
# 11:    mob        1       54     G     7
#...

或者一个更简单的版本是

setDT(df)[, .SD[sample(.N, 10, replace = TRUE)], by = type1]

基本上,我们在每个type1组内对行索引进行取样(带替换-因为每个组内的行数少于10行),然后通过此索引对数据进行子集化。


使用dplyr同样可以这样做:

library(dplyr)
df %>% 
  group_by(type1) %>%
  sample_n(10, replace = TRUE)

7

基于R语言的解决方案:

do.call(rbind,
        lapply(split(df, df$type1), function(i)
          i[sample(1:nrow(i), size = 10, replace = TRUE),]))

编辑:

@BrodieG提出的其他解决方案

with(DF, DF[unlist(lapply(split(seq(type), type), sample, 10, TRUE)), ])

with(DF, DF[c(sapply(split(seq(type), type), sample, 10, TRUE)), ])

5

在基础R中的另一个选项:

df[as.vector(sapply(unique(df$type1), 
                    function(x){
                        sample(which(df$type1==x), 10, replace=T)
                    })), ]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接