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

时间:2013-07-17 04:18:39

标签: r data.table

从我所看到的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()是否应该将字符串转换为因子,如果是,是否有“更好的方法”将这种行为关闭?

谢谢!

2 个答案:

答案 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>