【问题标题】:What are the practical differences between 'factor' and 'string' data types in R?R中“因子”和“字符串”数据类型之间的实际区别是什么?
【发布时间】:2017-09-11 11:51:29
【问题描述】:

从其他编程语言中,我熟悉字符串数据类型。除了这种数据类型,R 还具有因子数据类型。我是 R 语言的新手,所以我想了解一下这种新数据类型背后的意图。

问题: R 中“因子”和“字符串”数据类型之间的实际区别是什么?

我知道(在概念/哲学层面上)因子数据类型应该对分类随机变量的值进行编码,但我不明白(在实际层面上)为什么字符串数据类型不足以这个目的。

看似具有相同实际用途的重复数据类型将是bad design。然而,如果 R 在这样一个基本层面上的设计真的很糟糕,那么它就不太可能达到它所拥有的受欢迎程度。所以要么发生了非常不可能的事件,要么我误解了因子数据类型的实际意义/目的。

尝试:我能想到的一件事是“因子级别”的概念,其中可以为因子分配排序(不能对字符串执行此操作),这很有帮助在描述“有序分类变量”时,即具有顺序的分类变量(例如“低”、“中”、“高”)。

(尽管即使这样似乎也不会使因子严格成为必要。由于排序总是线性的,即在可数集上没有真正的偏序,我们总是可以用从整数的某个子集映射到有问题的字符串 - 但是在实践中,一遍又一遍地实现可能会很痛苦,而且天真的实现可能不如内置的因子和因子级别的实现那么有效R.)

但是,并非所有分类变量都是有序的,有些是“名义的”(即没有顺序)。然而,“因子”和“因子水平”似乎仍然与这些“名义分类变量”一起使用。为什么是这样? IE。对这些变量使用因子而不是字符串有什么实际好处?

我能找到的关于这个主题的唯一其他信息是以下引用 here

此外,将字符串变量存储为因子变量可以更有效地使用内存。

这是什么原因?这仅适用于“有序分类变量”,还是适用于“名义分类变量”?

相关但不同的问题:这些问题似乎相关,但并没有具体解决我的问题的核心——即因子和字符串之间的差异,以及为什么有这样的差异是有用的(从编程的角度来看,而不是统计角度)。

Difference between ordered and unordered factor variables in R
Factors ordered vs. levels
Is there an advantage to ordering a categorical variable?
factor() command in R is for categorical variables with hierarchy level only?

【问题讨论】:

    标签: r


    【解决方案1】:

    实际区别:

    1. 如果 x 是一个字符串,它可以取任何值。如果 x 是一个因子,它只能从所有级别的列表中获取一个值。这也使这些变量的内存效率更高。

    示例:

    > x <- factor(c("cat1","cat1","cat2"),levels = c("cat1","cat2") )
    > x
    [1] cat1 cat1 cat2
    Levels: cat1 cat2
    > x[3] <- "cat3"
    Warning message:
    In `[<-.factor`(`*tmp*`, 3, value = "cat3") :
      invalid factor level, NA generated
    > x
    [1] cat1 cat1 <NA>
    Levels: cat1 cat2
    
    1. 正如你所说,你可以有序数因子。这意味着您可以在变量中添加额外的信息,例如 level1

    【讨论】:

    • 哦,我只是假设顺序必须是线性的,因为这就是向量元素的列出方式。那么有可能用这些因素制作真正的偏序/树吗? IE。 “母亲>孩子”“父亲>孩子”但“母亲”和“父亲”不可比(或两个兄弟姐妹不可比,因为他们不是彼此的后代/祖先)?
    • 澄清一下,非线性是指 cat2>cat1 和 cat3>cat2 并不一定意味着 cat3 和 cat1 之间的差异是 cat2 和 cat1 之间差异的两倍。 R 给它们值 1,2 和 3 的事实并不意味着顺序是线性的,就像 R 给出值 1,2 和 3 一样,即使它们没有被定义为有序。这只是一个虚拟编码。话虽如此,我不确定您是否可以像您提到的那样将一个因子向量部分排序,但我对此表示怀疑,您可能必须使用 2 个不同的有序向量
    • 因子和字符向量的存储要求不再有任何实质性差异。字符向量是散列的,所以复制映射到相同的结果。
    猜你喜欢
    • 2015-03-12
    • 2013-08-02
    • 2023-03-08
    • 2021-06-12
    • 1970-01-01
    • 2022-10-23
    • 2020-02-04
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多