拆分列车/测试集R

拆分列车/测试集R,r,split,dataset,glm,sample,R,Split,Dataset,Glm,Sample,在我的数据集中,有一列包含NPS数据,其中数字从0变为10。10和9被称为“促进者”,8和7被称为“被动者”,6-0被称为“批评者”。我计划通过将变量NPS作为二进制(发起人和非发起人)来拟合模型。因此,我希望在执行glm之前将数据拆分为训练集和测试集。为了使培训集具有代表性,我尝试在数据集中包含50%的发起人和50%的非发起人 我的第一个问题:这是一个有效的方法吗 第二个问题:我在下面的代码中尝试分割数据集,并且能够生成训练集 table(mydata$NPS) # 0 1

在我的数据集中,有一列包含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, ]

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

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

test\u mydata
train\u mydata
是一个
data.frame
,因此它是一个
列表
。在对mydata进行子集设置时,只能使用向量作为索引,但此处使用的是列表,因此出现错误
无效的下标类型“list”

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

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

test\u mydata您的第一个问题听起来像是一个统计分析问题,最好是在交叉验证(统计堆栈交换站点)上。当我为序列集选择一个随机样本时(代码:train_mydata4@user13178113我不明白您所说的
是什么意思,它从原始数据集中选择第一组行。如果
cr_mydata4.selected
包含所有行,您可以在
train_mydata4
中随机选择行,现在可以进行
测试\u mydata4我检查了train和test的ID。)set.head(data.frame(as.integer(rownames(train_mydata4)))
111399210249318345454519951995117406610449
head(data.frame(as.integer(rownames(test_mydata4)))
1 1 2 3 4 4 5 6列车组的行ID为11399、10249、18345、5199、17406、10449等,测试组的行ID为1、2、3、4、5、6,因此,列车组看起来是随机的,而后者看起来不是随机的。你可能应该用这些细节问一个新问题。
test_mydata <- mydata[!(mydata$ID %in% train_mydata$ID), ]