【问题标题】:data.table() still converts strings to factors?data.table() 仍然将字符串转换为因子?
【发布时间】:2013-07-15 11:46:03
【问题描述】:

据我所见here 我会假设 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() 是否应该将字符串转换为因子,如果是,是否有“更好的方法”来关闭该行为?

谢谢!

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    更新:

    直到现在,这个问题似乎已经过去了。感谢@fpinter 最近提供了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 使用 as.data.table 处理 matrix 参数

    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])
        }
    

    可能值得将此报告给错误跟踪器。 (目前 r-forge 版本 1.8.9 还在实现)

    【讨论】:

    • +1 不错,希望这种行为会改变为一致data.table默认
    【解决方案2】:

    作为一种解决方法并完成@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> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 2016-12-11
      • 2019-10-16
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      • 2023-02-01
      相关资源
      最近更新 更多