我有一个非常简单的请求,但是我不能通过使用一个代码行来处理。
我想要的只是输入数据帧的子集,在输出数据帧中,对于一个特定数据帧的列的每个唯一值(因子的级别),只有一个随机选择的行
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
提前感谢您的任何建议!
答案 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
:对于替换品抽样。