从我所看到的here我认为data.table v1.8.0 +不会自动将字符串转换为因子。
具体来说,从该页面引用Matthew Dowle:
不需要stringsAsFactors。在v1.8.0中完成了这样的操作:o现在允许在键中使用字符列,并且优先考虑因素。 data.table()和setkey()不再强迫字符到因子。仍然支持因素。
我没有看到......这是我的R会话记录:
首先,我确保我有一个最新版本的data.table> 1.8.0
> library(data.table)
data.table 1.8.8 For help type: help("data.table")
接下来,我创建一个2x2 data.table。请注意,它会创建因子......
> m <- matrix(letters[1:4], ncol=2)
> str(data.table(m))
Classes ‘data.table’ and 'data.frame': 2 obs. of 2 variables:
$ V1: Factor w/ 2 levels "a","b": 1 2
$ V2: Factor w/ 2 levels "c","d": 1 2
- attr(*, ".internal.selfref")=<externalptr>
当我在data.frame()中使用stringsAsFactors然后调用data.table()时,一切都很好......
> str(data.table(data.frame(m, stringsAsFactors=FALSE)))
Classes ‘data.table’ and 'data.frame': 2 obs. of 2 variables:
$ X1: chr "a" "b"
$ X2: chr "c" "d"
- attr(*, ".internal.selfref")=<externalptr>
我错过了什么? data.frame()是否应该将字符串转换为因子,如果是,是否有“更好的方法”将这种行为关闭?
谢谢!
答案 0 :(得分:11)
直到现在,这个问题似乎已经过去了。最近感谢@fpinter for filing the issue。它现在已在commit 1322中修复。来自NEWS,No:39,修复了v1.9.3的错误:
默认情况下,
as.data.table.matrix
不会将字符串转换为因子。data.table
喜欢并且更喜欢使用字符向量来表示因素。关闭#745。感谢@fpinter在github问题跟踪器上报告问题,并感谢vijay在SO上报告here。
这种非强制行为似乎尚未实施。
data.table
使用matrix
as.data.table
个参数
if (is.matrix(xi) || is.data.frame(xi)) {
xi = as.data.table(xi, keep.rownames = keep.rownames)
x[[i]] = xi
numcols[i] = length(xi)
}
和
as.data.table.matrix
包含
if (mode(x) == "character") {
for (i in ic) value[[i]] <- as.factor(x[, i])
}
可能值得向bug跟踪器报告此事。 (它仍然在1.8.9中实现,当前的r-forge版本)
答案 1 :(得分:6)
作为解决方法并完成@mnel答案,如果要关闭data.frame的默认行为,可以使用专用选项。
options(stringsAsFactors=FALSE)
str(data.table(data.frame(m)))
Classes ‘data.table’ and 'data.frame': 2 obs. of 2 variables:
$ X1: chr "a" "b"
$ X2: chr "c" "d"
- attr(*, ".internal.selfref")=<externalptr>