我有一个数据集,我想从中选择随机的行样本,但要遵循一些预定义的规则。这可能是一个非常基本的问题,但是我对此并不陌生,仍在尝试掌握基本概念。我的数据集包含约330行数据(这里包括简化版本)和几列。我想对330行中的50行进行采样(为简化起见,我将这些数字保留在模拟数据集中,因为这是我所遇到的问题的一部分),并可以选择向采样过程中添加预定义的规则。 这是数据的模拟版本:
bank<-data.frame(matrix(0,nrow=330,ncol=5))
colnames(bank)<-c("id","var1","var2","year","lo")
bank$id<-c(1:330)
bank$var1<-sample(letters[1:5],330,replace=T)
bank$var2<-sample(c("s","r"),330,replace=T)
bank$var3<-sample(2010:2018,330,replace=T)
bank$lo<-sample(c("lo1","lo2","lo3","lo4","lo5","lo6"),330,replace=T)
我用来尝试采样正确行数的代码是
library(splitstackshape)
x<-splitstackshape::stratified(indt=bank,group=c("var1","var2","year","lo"),0.151)
但是,这没有选择50行。我最初尝试定义size = 50,但出现以下错误:
Groups b s 2012 lo4,... [there is a very long list here],...contain fewer rows than requested. Returning all rows.
然后,我尝试将大小定义为百分比:0.151(15.1%?),应该是330中的50,但该示例采样了5行(我尝试了0.5行,并采样了44行,如果尝试了0.500000001,它就采样了287行? ??)。
我想念什么?目前,我被困在这里。
一旦我设法采样了正确的行数(50),我想定义一些规则,例如:仅最多50%的样本可以有2018(bank $ year),最多只有一半的bank $ year == 2018行可以具有bank $ var2 ==“ r”。显然我不希望有人为我做这件事,但是请您提供一些建议
1-为什么我的行数错误(可能只是语法?) 2-如果splitstackshape :: stratified()不是实现这一目标的最佳选择,我应该考虑哪些软件包?
非常感谢! M
答案 0 :(得分:1)
我认为问题来自以下事实:您的数据集(如您在此处共享的)很小,您拥有大量的阶层(5个字母X 2 s或r X 9年X 6个lo类别),而且不可能从每个阶层中获取所需大小的样本。当我将样本量增加到33,000并采取15.1%的样本时,我得到的样本量为4,994。放置大小= 50表示要从每个层中获取大小为50的样本,这对于共享的数据来说是不可能的。
> bank<-data.frame(matrix(0,nrow=33000,ncol=5))
> colnames(bank)<-c("id","var1","var2","year","lo")
> bank$id<-c(1:33000)
> bank$var1<-sample(letters[1:5],33000,replace=T)
> bank$var2<-sample(c("s","r"),33000,replace=T)
> bank$var3<-sample(2010:2018,33000,replace=T)
> bank$lo<-sample(c("lo1","lo2","lo3","lo4","lo5","lo6"),330,replace=T)
>
> k <- stratified(bank, group = c('var1', 'var2', 'var3', 'lo'), size = .151)
> dim(k)
[1] 4994 6
答案 1 :(得分:0)
另一个过程,通过选择每组所需的n =个样本,由詹妮·布赖恩(Jenny Bryan)here提供;从每组中基于特定样本量指定n的组中抽样,samp是每n组中的随机抽样;因此需要根据每组的比例量来调整n:
bank %>%
group_by(var1) %>%
nest() %>%
mutate(n = c(7,0,9,1,13),
samp = map2(data, n, sample_n)) %>%
select(var1, samp) %>%
unnest()