data.table()仍将字符串转换为因子?

vij*_*jay 10 r data.table

从我在这里看到的,我会假设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")
Run Code Online (Sandbox Code Playgroud)

接下来,我创建一个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> 
Run Code Online (Sandbox Code Playgroud)

当我在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> 
Run Code Online (Sandbox Code Playgroud)

我错过了什么?data.frame()是否应该将字符串转换为因子,如果是这样,是否有"更好的方法"将这种行为关闭?

谢谢!

mne*_*nel 11

更新:

直到现在,这个问题似乎已经过去了.感谢@fpinter 最近提交了该问题.它现在在提交1322中修复.来自NEWS,No:39针对v1.9.3的错误修复:

as.data.table.matrix默认情况下不会将字符串转换为因子.data.table喜欢并喜欢使用字符向量来表示因素.关闭#745.感谢@fpinter报告了github问题跟踪器上的问题,并感谢vijay报告此处的SO.


看来这种非强制性尚未实施.

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)
        }
Run Code Online (Sandbox Code Playgroud)

as.data.table.matrix

包含

if (mode(x) == "character") {
        for (i in ic) value[[i]] <- as.factor(x[, i])
    }
Run Code Online (Sandbox Code Playgroud)

可能值得向bug跟踪器报告此信息.(它仍然在1.8.9中实现,目前的r-forge版本)


dic*_*koa 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> 
Run Code Online (Sandbox Code Playgroud)