无法在R中使用createDataPartition创建完全相等的数据分区-分别获得1396和1398观测值,但需要1397

时间:2019-01-04 10:31:47

标签: r data-partitioning

我对R非常熟悉,但是从来没有这个要求,我需要使用R中的createDataPartition随机创建完全相等的数据分区。

index = createDataPartition(final_ts$SAR,p=0.5, list = F)
final_test_data = final_ts[index,]
final_validation_data = final_ts[-index,]

此代码创建两个分别具有1396和1398观测值的数据集。

令我惊讶的是,为什么p = 0.5并未执行应做的事情。它与默认情况下没有奇数个观测值的结果数据集有关吗? 预先感谢!

2 个答案:

答案 0 :(得分:2)

这与响应变量的大小(在您的情况下为final_ts$SAR)有关。

例如:

y <- rep(c(0,1), 10)
table(y)
y
0  1 
10 10 
# even number of cases

现在我们分开:

train <- y[caret::createDataPartition(y, p=0.5,list=F)]
table(train) # we have 10 obs 
train
0 1 
5 5 

test <- y[-caret::createDataPartition(y, p=0.5,list=F)]
table(test) # we have 10 obs.
test
0 1 
5 5 

如果我们用奇数个案例进行构建和示例:

y <- rep(c(0,1), 11)
table(y)
y
0  1 
11 11 

我们有:

train <- y[caret::createDataPartition(y, p=0.5,list=F)]
table(train) # we have 12 obs.
train
0 1 
6 6 

test <- y[-caret::createDataPartition(y, p=0.5,list=F)]
table(test) # we have 10 obs.
test
0 1 
5 5 

更多信息here

答案 1 :(得分:0)

这里是另一个线程,它解释了为什么从createDataPartition返回的数字对我们来说似乎是“关闭”的,而不是根据此函数试图执行的操作而定。 因此,这取决于您在final_ts $ SAR中拥有什么以及数据的传播范围。 如果是分类值,例如:T和F,如果总计为100,则55为T,45为F。在代码中调用方式时,它将返回51,因为: 55 * 0.5 = 27.5,45 * 0.5 = 22.5,将每个结果四舍五入,28 + 23 = 51。

当您要拆分的值是数字时,您可以参考下面的线程,对此有很好的解释。

R - caret createDataPartition returns more samples than expected