分割火车/测试仪R

时间:2020-04-12 08:12:51

标签: r split dataset glm sample

在我的数据集中,有一列包含NPS数据,其中数字从0变为10。10和9被称为“促进者”,8和7被称为“被动者”,而6-0被称为“贬低者” 。我打算通过将变量NPS视为二进制文件(促进者和非促进者)来拟合模型。因此,我想在执行glm之前将数据分为训练集和测试集。为了使训练集具有代表性,我尝试在数据集中包含50%的启动子和50%的非启动子。

我的第一个问题:这是有效的方法吗?

第二个问题:我尝试使用下面的代码拆分数据集,并且能够生成训练集。

table(mydata$NPS)
#    0     1     2     3     4     5     6     7     8     9    10 
#   18    31    49    62    90   217   514  2332 10600  6557  2003

nrow(mydata) # = 22473

#total number of promoters = 8560
#total number of non-promoters = 13913

8560*0.8 #=6848 80% of promoters count

#all the promoters 
data_promoters<-mydata[(mydata$NPS==10 | mydata$NPS==9),]
#all the non promoters
data_nonPromoters<-mydata[(mydata$NPS!=10 & mydata$NPS!=9),]

dim(data_promoters) #8560    32
dim(data_nonPromoters) #13913    32

set.seed(100)

sample_promoters <- data_promoters[sample(1:nrow(data_promoters),6848),]
sample_nonPromoters <- data_nonPromoters[sample(1:nrow(data_nonPromoters),6848),]

#train dataset
train_mydata <- rbind(sample_promoters, sample_nonPromoters)
head(train_mydata)
tail(train_mydata)
dim(train_mydata) #13696 32

#test dataset
test_mydata<-mydata[-train_mydata, ]

按上述方式形成测试集时,出现以下错误。你能帮我解决这个问题吗?非常感谢!

Error in `[.default`(xj, i) : invalid subscript type 'list'
In addition: Warning messages:
1: In Ops.factor(left) : ‘-’ not meaningful for factors
2: In Ops.factor(left) : ‘-’ not meaningful for factors
3: In Ops.factor(left) : ‘-’ not meaningful for factors
4: In Ops.factor(left) : ‘-’ not meaningful for factors
5: In Ops.factor(left) : ‘-’ not meaningful for factors

2 个答案:

答案 0 :(得分:1)

您可以使用anti_join中的dplyrmydata中获取train_mydata中不存在的行

test_mydata <- dplyr::anti_join(mydata, train_mydata)

答案 1 :(得分:0)

train_mydatadata.frame,因此它是list。子集mydata时,只能使用向量作为索引,但是这里使用的是列表,因此错误为invalid subscript type 'list'

在这种情况下,我通常要做的是给每行一个ID,然后简单地做

test_mydata <- mydata[!(mydata$ID %in% train_mydata$ID), ]