为数据框的一个特定列中的每个唯一值选择随机行

时间:2013-09-04 08:30:14

标签: r dataframe

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

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

E.x。我有(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  

提前感谢您的任何建议!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

方式比你要求的更多,但我写了一个名为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变量是“Group”,并且它包含三个层次,“A”,“B”和“C”,但您只想从“A”和“C”进行采样,您可以使用select = list(Group = c("A", "C"))
  • replace:对于替换品抽样。