R中'factor'和'string'数据类型之间的实际差异是什么?

时间:2017-04-15 10:09:47

标签: r

从其他编程语言我熟悉字符串数据类型。除此数据类型外,R还具有因子数据类型。我是R语言的新手,所以我试图围绕这种新数据类型背后的意图。

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

我得到了(在概念/哲学层面)因子数据类型应该编码分类随机变量的值,但我不理解(在实际水平上)为什么字符串数据类型不足以这个目的。

看似具有相同实际目的的重复数据类型将是bad design。但是,如果R在这样一个基础层面上的设计真的很差,那么它的可能性就会大大降低。所以要么发生了一个非常不可能的事件,要么我误解了因子数据类型的实际意义/目的。

尝试:我能想到的一件事是“因子水平”的概念,即人们可以为因子分配一个排序(对于字符串不能做什么),这是有帮助的描述“序数分类变量”时,即带有顺序的分类变量(例如“低”,“中”,“高”)。

(虽然这似乎不会使因素严格必要。由于排序总是线性的,即没有真正的偏序,在可数集上,我们总是可以用一个完成相同的从整数的某个子集映射到相关的字符串 - 但是在实践中,反复实施可能会很痛苦,而且一个简单的实现可能不会像内置的因子和因子级别的实现那样有效R上。)

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

我在此主题上找到的唯一其他信息是以下引用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?

1 个答案:

答案 0 :(得分:2)

实际差异:

  1. 如果x是一个字符串,它可以取任何值。如果x是一个因子,它只能从所有级别的列表中获取值。这使得这些变量也更具记忆效率。
  2. 示例:

    > 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&lt; level2&lt; 3级。人物没有这个。但是,订单不一定必须是线性的,不确定您在哪里找到它。
相关问题