11

从我在这里看到的情况来看,我假设 data.table v1.8.0+ 不会自动将字符串转换为因子。

具体来说,从该页面引用 Matthew Dowle:

不需要字符串AsFactors。在 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() 是否应该将字符串转换为因子,如果是,是否有“更好的方法”来关闭该行为?

谢谢!

4

2 回答 2

10

更新:

直到现在,这个问题似乎已经以某种方式溜走了。感谢@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)
        }

as.data.table.matrix

包含

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

可能值得将此报告给错误跟踪器。(它仍在 1.8.9 中实现,当前的 r-forge 版本)

于 2013-07-17T04:34:53.927 回答
6

作为一种解决方法并完成@mnel 答案,如果您想关闭 data.frame 的默认行为,您可以使用 dedicated 选项。

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> 
于 2013-07-17T04:38:40.657 回答