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