R插入符号在训练后重命名data.table中的列

R插入符号在训练后重命名data.table中的列,r,data.table,r-caret,R,Data.table,R Caret,由于某种原因,caret程序包中的train函数会更改响应变量的名称。以下是一个玩具示例: library(caret) library(data.table) DT <- data.table(x = rnorm(10), y = rnorm(10)) > DT # x y #1: -1.7844589 0.4834738 #2: -0.3519577 -0.4644998 #3: 1.0697762 -0.9183105 #4

由于某种原因,
caret
程序包中的
train
函数会更改响应变量的名称。以下是一个玩具示例:

library(caret)
library(data.table)
DT <- data.table(x = rnorm(10), y = rnorm(10))
> DT
 #            x          y
 #1: -1.7844589  0.4834738
 #2: -0.3519577 -0.4644998
 #3:  1.0697762 -0.9183105
 #4: -0.2624022 -1.0952624
 #5: -1.0875959 -1.0267012
 #6:  0.1442927 -0.8669099
 #7:  0.3886957  0.2272433
 #8: -0.1625200  0.8286582
 #9: -0.5419324 -0.0526076
 #10:  0.4669790  0.2916581
cv.ctrl <- trainControl(method = 'repeatedcv', number = 5, repeats = 1)
fit <- train(y ~ x, data = DT, 'lm', trControl = cv.ctrl)
> DT
 #            x   .outcome
 #1: -1.7844589  0.4834738
 #2: -0.3519577 -0.4644998
 #3:  1.0697762 -0.9183105
 #4: -0.2624022 -1.0952624
 #5: -1.0875959 -1.0267012
 #6:  0.1442927 -0.8669099
 #7:  0.3886957  0.2272433
 #8: -0.1625200  0.8286582
 #9: -0.5419324 -0.0526076
 #10:  0.4669790  0.2916581

Hrm…使用
data.frame
时,它不会再现结果:

dat <- data.frame(x = rnorm(10), y = rnorm(10))
cv.ctrl <- trainControl(method = 'repeatedcv', number = 5, repeats = 1)
fit.1 <- train(y ~ x, data = dat, 'lm', trControl = cv.ctrl)
dat
##             x           y
## 1  -0.3458644 -0.96606867
## 2   1.2248085  0.02072409
## 3  -1.7541273 -0.26734265
## 4   0.7887834 -0.51012773
## 5  -2.2282504  0.91898424
## 6  -1.4195865  1.24238977
## 7  -1.3931804 -0.15301954
## 8  -0.6822076  0.32615825
## 9  -1.2455969  1.00837799
## 10 -0.4506061 -0.09332418
dat更新:这在当前的开发版本1.9.5中已经修复。发件人:

names确切地说,可能是
caret
以某种奇怪的方式与
data.table
交互。不太可能。包将其视为R中
data.table
之前的任何其他对象(其中作用域规则阻止这种情况发生)<代码>数据。表
通过引用执行所有操作,因此违反了先前的“规范”(而不是执行不同的操作)。@topepo,如果您无法从github获得标记,我已经详细说明了问题<代码>数据。表
不通过引用修改所有内容(仅
:=
设置*
函数通过引用修改)。这是一个v3.1+版本的问题,因为它现在尽可能地进行浅拷贝,而不是深度拷贝。我们只是还没修好。但现在,为下一个版本设置的优先级和里程碑发生了变化。@Arun,你刚刚修复了它吗?因为我再也不能复制这个bug了,我确实在使用R3.1.0。谢谢
dat <- data.frame(x = rnorm(10), y = rnorm(10))
cv.ctrl <- trainControl(method = 'repeatedcv', number = 5, repeats = 1)
fit.1 <- train(y ~ x, data = dat, 'lm', trControl = cv.ctrl)
dat
##             x           y
## 1  -0.3458644 -0.96606867
## 2   1.2248085  0.02072409
## 3  -1.7541273 -0.26734265
## 4   0.7887834 -0.51012773
## 5  -2.2282504  0.91898424
## 6  -1.4195865  1.24238977
## 7  -1.3931804 -0.15301954
## 8  -0.6822076  0.32615825
## 9  -1.2455969  1.00837799
## 10 -0.4506061 -0.09332418
library(caret)
library(data.table)
DT <- data.table(x = rnorm(10), y = rnorm(10))
cv.ctrl <- trainControl(method = 'repeatedcv', number = 5, repeats = 1)
fit <- train(y ~ x, data = as.data.frame(DT), 'lm', trControl = cv.ctrl)
DT
#              x           y
# 1: -0.06027817  1.32641243
# 2:  0.28842856  0.60240700
# 3:  1.14196056  0.97159637
# 4: -0.82907332  0.82955574
# 5:  0.73742357 -0.63901239
# 6:  0.12551649  1.33047527
# 7: -1.12110293 -0.03315772
# 8:  0.29933697 -1.52464998
# 9:  1.66046182  0.21068356
# 10: -0.09126467  2.02206078