在我的数据集中,有一列包含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
答案 0 :(得分:1)
您可以使用anti_join
中的dplyr
从mydata
中获取train_mydata
中不存在的行
test_mydata <- dplyr::anti_join(mydata, train_mydata)
答案 1 :(得分:0)
train_mydata
是data.frame
,因此它是list
。子集mydata
时,只能使用向量作为索引,但是这里使用的是列表,因此错误为invalid subscript type 'list'
。
在这种情况下,我通常要做的是给每行一个ID,然后简单地做
test_mydata <- mydata[!(mydata$ID %in% train_mydata$ID), ]