使用caret和data.table创建数据分区

Jam*_*aul 5 r data.table r-caret

我在R中有一个data.table,我想用插入包

set.seed(42)
trainingRows<-createDataPartition(DT$variable, p=0.75, list=FALSE)
head(trainingRows) # view the samples of row numbers
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用data.table选择行.相反,我必须转换为data.frame

DT_df <-as.data.frame(DT)
DT_train<-DT_df[trainingRows,]
dim(DT_train)
Run Code Online (Sandbox Code Playgroud)

data.table替代方案

DT_train <- DT[.(trainingRows),] requires the keys to be set.
Run Code Online (Sandbox Code Playgroud)

除了转换为data.frame之外还有更好的选择吗?

Bru*_*cci 5

滚动你自己

inTrain <- sample(MyDT[, .I], floor(MyDT[, .N] * .75))
Train <- MyDT[inTrain]
Test <- MyDT[-inTrain]
Run Code Online (Sandbox Code Playgroud)

或者使用Caret功能,您可以trainingRows使用ac()进行换行.

 trainingRows<-createDataPartition(DT$variable, p=0.75, list=FALSE)
 Train <- DT[c(trainingRows)]
 Test <- DT[c(-trainingRows)]
Run Code Online (Sandbox Code Playgroud)

===

由Matt编辑
是要添加评论,但是太长了.

我已经看到sample(.I,...)最近使用了很多.这是低效的,因为它必须创建(可能非常长).I向量1:nrow(DT).这是一个常见的情况,R sample()不需要你传递该向量.只是通过长度.sample(nrow(DT))已经返回完全相同的结果而无需创建.I.见?sample.

此外,最好尽可能避免变量名称重复.更多背景在这里.

所以代替:

inTrain <- sample(MyDT[, .I], floor(MyDT[, .N] * .75))
Run Code Online (Sandbox Code Playgroud)

我会做 :

inTrain <- MyDT[,sample(.N, floor(.N*.75))]
Run Code Online (Sandbox Code Playgroud)


jan*_*cki 5

原因是createDataPartition产生具有两个维度的整数向量,其中第二个可以无损地丢弃.
您可以简单地减少trainingRows以下使用的维度:

DT[trainingRows[,1]]
Run Code Online (Sandbox Code Playgroud)

c()Bruce Pucci的回答中的功能也将减少维度.

很久以前就发现了与data.frame的这种微小差异,最近我已经制作了PR #1275以填补这一空白.