【发布时间】:2019-01-14 23:28:28
【问题描述】:
我有一个数据集,我想从中选择随机的行样本,但要遵循一些预定义的规则。这可能是一个非常基本的问题,但我对此很陌生,并且仍在努力掌握基本概念。我的数据集包含大约 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
【问题讨论】: