1

我有一个非常简单的请求,但是我无法通过使用一行代码来处理。

我想要的只是对输入数据框进行子集化,即在输出数据框中,对于一个特定数据框列的每个唯一值(因子级别)只有一个随机选择的行。

例如我有(v2 是特定数据框的列

   v1 v2
1   A  1                      
2   B  1      
3   C  2
4   A  1
5   B  2
6   B  1
7   B  1
8   C  2
9   D  1
10  E  1

并希望将其作为输出数据框:

   v1 v2
1   B  1                      
2   C  2  

提前感谢您的任何建议!

4

2 回答 2

6

这比您要求的要多,但是我编写了一个名为的函数stratified可让您从data.frame一个或多个组变量中随机抽取样本。

您可以像这样加载并使用它:

library(devtools)
source_gist("https://gist.github.com/mrdwab/6424112")
# [1] "https://raw.github.com/gist/6424112"
# SHA-1 hash of file is 0006d8548785ec8a5651c3dd599648cc88d153a4    

## One row
stratified(mydf, "v2", 1)
#    v1 v2
# 10  E  1
# 8   C  2

## Two rows
stratified(mydf, "v2", 2)
#   v1 v2
# 2  B  1
# 6  B  1
# 3  C  2
# 5  B  2

我会在某个时候向该函数添加官方文档,但这里有一个摘要可以帮助您充分利用它:

的论据stratified是:

  • df: 输入data.frame
  • group:组成“层”的一列或多列的字符向量。
  • size:所需的样本量。
    • 如果size是一个小于 1 的值,则从每个层中抽取一个比例样本。
    • 如果size是 1 或更大的单个整数,则从每个层中获取该数量的样本。
    • 如果size是整数向量,则为每个层获取指定数量的样本。建议您使用命名向量。例如,如果您有两个层,“A”和“B”,并且您想要“A”中的 5 个样本和“B”中的 10 个样本,您将输入size = c(A = 5, B = 10)
  • select:这允许您在采样过程中对组进行子集化。这是一个list. 例如,如果您的group变量是“组”,它包含三个层,“A”、“B”和“C”,但您只想从“A”和“C”中抽样,您可以使用select = list(Group = c("A", "C")).
  • replace: 用于更换取样。
于 2013-09-04T09:05:50.407 回答
4

您可以遍历列中的唯一值并找到每个值的行索引,并使用随机选择一个行索引sample。像这样:

#  Set seed for reproducible results
set.seed(1)

#  Generate indices
ind <- sapply( unique( df$v2 ) , function(x) sample( which(df$v2==x) , 1 ) )

#  Subset data.frame
df[ ind , ]
#  v1 v2
#2  B  1
#5  B  2
于 2013-09-04T08:32:49.277 回答