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

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

问题:R中’factor’和’string’数据类型之间有什么实际差异?

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

看似具有相同实用目的的重复数据类型将是bad design.但是,如果R在这样一个基本层面上设计得真的很差,那么它实现它的普及程度的可能性要小得多.所以要么发生了一个非常不可能的事件,要么我误解了因子数据类型的实际意义/目的.

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

(虽然这似乎不会使因素严格必要.因为排序总是线性的,即没有真正的偏序,在可数集上,我们总是可以用从整数的某个子集到字符串的映射完成相同的操作.问题 – 然而在实践中反复实施可能是一种痛苦,而天真的实施可能不如R中内置的因子和因子水平的实施那么有效.)

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

我能在这个问题上找到的唯一其他信息是以下引用here:

Furthermore, storing string variables as factor variables is a more efficient use of memory.

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

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

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?

最佳答案 实际差异:

>如果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

>正如你所说,你可以有序数因素.这意味着您可以在变量中添加额外的信息,例如level1< level2< 3级.人物没有那个.但是,订单不一定必须是线性的,不确定您发现的位置.

点赞