【问题标题】:read.csv doesn't seem to detect factors in R 4.0.0read.csv 似乎没有检测到 R 4.0.0 中的因素
【发布时间】:2020-05-22 08:32:35
【问题描述】:

我最近从 R 3.5.1 更新到 R 4.0.0。 read.csv 的行为似乎发生了变化——当我在 R 4.0.0 中加载 .csv 文件时,不会自动检测到因素,而是将其识别为字符。我还在我的机器上运行 3.5.1,当使用相同的代码在 3.5.1 中加载相同的文件时,因子被识别为因子。这有点不太理想。

有什么建议吗?

我正在运行 Windows 10 Pro 并在 Excel 2013 中创建 .csv 文件。

【问题讨论】:

标签: r categorical-data read.csv r-4.0.0


【解决方案1】:

正如 Ronak Shah 在对您的问题的评论中所说,R 4.0.0 更改了 read.table()(以及包括 read.csv() 在内的包装器)处理字符向量的默认行为。关于这个问题一直存在长期争论,但基本上stringsAsFactors == T 设置是自 R 诞生以来的默认设置,因为它有助于节省内存,因为 R 中实现了因子变量的方式(本质上它们是具有因子级别的整数向量信息添加在顶部)。现在没有理由这样做了,因为内存要丰富得多,而且这个选项经常会产生意想不到的副作用。

您可以在 Hadley Wickham 的 Advanced R 的 Chapter 3 中阅读有关您的特定问题以及 R 中向量的其他特性的更多信息。在那里,他给出了两篇文章,非常详细地说明了为什么默认行为是这样的。 Here 是一个,here 是另一个。如果您已经对 R 有一些经验,我还建议您查看 Hadley 的书,它对我学习该语言的一些不太明显的特性非常有帮助。

【讨论】:

  • 我认为当 R 的字符类型被更改为 hasked 存储时,内存使用问题就消失了。因此,向量中 100 字节字符值的 100 个实例不再占用 100*100 字节,而是仅占用 100*2+100 字节,因此就存储而言,它与一个因素几乎相同。不确定这是什么时候发生的。认为它可能是 R 3.4???
【解决方案2】:

正如这里的每个人所说 - R 4.0.0 中的默认行为已经改变,字符串不再自动转换为因子。这会影响各种功能,包括read.csv()data.frame()。然而,一些明确地与因子一起工作的函数不受影响。其中包括expand.grid()as.data.frame.table()

绕过此更改的一种方法是设置全局选项:

options(stringsAsFactors = TRUE)

但这也将被弃用,最终您将不得不手动将字符串转换为因子。

做出这种决定的主要原因似乎是可重复性。字符串到因子的自动转换会产生因子级别,这些级别可能取决于系统使用的语言环境。因此,如果您来自俄罗斯并与您在日本的朋友分享您的脚本自动转换的因子,他最终可能会得到不同的因子水平顺序。

您可以在 Kurt Hornik 的帖子“The R Blog”stringsAsFactors 上阅读更多相关信息

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    相关资源
    最近更新 更多