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

Chi*_*cht 6 r

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

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

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

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

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

(尽管即使这样似乎也不会严格要求因数。由于排序始终是线性的,即没有真正的偏序,在可数集合上,我们总是可以使用从整数的某些子集到字符串的映射来完成相同的操作有问题——但是在实践中,一遍又一遍地实施可能会很痛苦,而且一个幼稚的实施可能不会像 R 中内置的因素和因素级别的实施那样有效。)

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

唯一的其他信息,我能找到关于这个问题的是下面的报价在这里

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

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

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

R 中有序和无序因子变量之间的区别
有序与水平的因子 对
分类变量进行排序是否有优势?
R 中的 factor() 命令仅用于具有层次结构级别的分类变量?

Vas*_*iou 6

实际差异:

  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
Run Code Online (Sandbox Code Playgroud)
  1. 正如你所说,你可以有序数因素。这意味着您可以添加有关变量的额外信息,例如 level1 < level2 < level3。人物没有这个。但是,顺序不一定必须是线性的,不确定您在哪里找到的。

  • 只是为了澄清,我所说的非线性是指 cat2&gt;cat1 和 cat3&gt;cat2 并不一定意味着 cat3 和 cat1 之间的差异是 cat2 和 cat1 之间差异的两倍。R 给出值 1,2 和 3 的事实并不意味着顺序是线性的,就像 R 给出值 1,2 和 3 一样,即使它们没有定义为有序的。这只是一个虚拟编码。话虽这么说,我不确定你是否可以像你提到的那样将一个因子向量部分排序,但我对此表示怀疑,你可能必须使用 2 个不同的有序向量 (3认同)
  • 因子向量和字符向量的存储要求不再有任何实质性差异。字符向量经过哈希处理,因此重复映射到相同的结果。 (2认同)