在其他编程语言中,我熟悉字符串数据类型。除了这种数据类型,R 还有因子数据类型。我是 R 语言的新手,所以我试图围绕这种新数据类型背后的意图。
问题: R 中“因子”和“字符串”数据类型之间的实际区别是什么?
我知道(在概念/哲学层面上)因子数据类型应该对分类随机变量的值进行编码,但我不明白(在实际层面上)为什么字符串数据类型不足以达到这个目的。
看似具有用于相同实际目的的重复数据类型将是糟糕的设计。然而,如果 R 在这样一个基本层面上真的设计得很糟糕,那么它达到它所拥有的受欢迎程度的可能性就会大大降低。因此,要么发生了非常不可能的事件,要么我误解了因子数据类型的实际意义/目的。
尝试:我能想到的一件事是“因子级别”的概念,可以为因子分配排序(不能对字符串进行排序),这在描述“有序分类变量”时很有帮助,即分类具有顺序的变量(例如“低”、“中”、“高”)。
(尽管即使这样似乎也不会严格要求因数。由于排序始终是线性的,即没有真正的偏序,在可数集合上,我们总是可以使用从整数的某些子集到字符串的映射来完成相同的操作有问题——但是在实践中,一遍又一遍地实施可能会很痛苦,而且一个幼稚的实施可能不会像 R 中内置的因素和因素级别的实施那样有效。)
然而,并非所有分类变量都是有序的,有些是“名义”的(即没有顺序)。然而,“因子”和“因子水平”似乎仍然与这些“名义分类变量”一起使用。为什么是这样?即对这些变量使用因子而不是字符串有什么实际好处?
唯一的其他信息,我能找到关于这个问题的是下面的报价在这里:
此外,将字符串变量存储为因子变量可以更有效地利用内存。
这是什么原因?这仅适用于“有序分类变量”,还是适用于“名义分类变量”?
相关但不同的问题:这些问题似乎相关,但并没有具体解决我的问题的核心——即因子和字符串之间的差异,以及为什么有这种差异是有用的(从编程的角度来看,而不是统计的角度) )。
R 中有序和无序因子变量之间的区别
有序与水平的因子 对
分类变量进行排序是否有优势?
R 中的 factor() 命令仅用于具有层次结构级别的分类变量?
我一直在尝试找到R 中ordered无序factor变量和无序变量之间的区别。尤其是文档中的这一行?factor让我感到困惑:
Ordered factors differ from factors only in their class, but methods and
the model-fitting functions treat the two classes quite differently.
Run Code Online (Sandbox Code Playgroud)
我最接近找到答案的是从这三个问题的答案:
在对上述第一个问题的回答中,@joran说“统计差异的详细总结可能超出了 StackOverflow 回答的范围。”
我不是在这里寻找详细的总结,但是谁能给出一个小而简单的例子来演示在方法和模型拟合函数中使用时ordered无序和无序的factor区别?
我有一个包含因子列的data.frame,我想在其上计算最大值(或最小值或分位数).我不能在因素上使用这些功能,但我想.
这是一些例子:
set.seed(3)
df1 <- data.frame(id = rep(1:5,each=2),height=sample(c("low","medium","high"),size = 10,replace=TRUE))
df1$height <- factor(df1$height,c("low","medium","high"))
df1$height_num <- as.numeric(df1$height)
# > df1
# id height height_num
# 1 1 low 1
# 2 1 high 3
# 3 2 medium 2
# 4 2 low 1
# 5 3 medium 2
# 6 3 medium 2
# 7 4 low 1
# 8 4 low 1
# 9 5 medium 2
# 10 5 medium 2
Run Code Online (Sandbox Code Playgroud)
我可以轻松地做到这一点:
aggregate(height_num ~ id,df1,max)
# id height_num …Run Code Online (Sandbox Code Playgroud) I have a data frame with lot of company information separated by an id variable. I want to sort one of the variables and repeat it for every id. Let's take this example,
df <- structure(list(id = c(110, 110, 110, 90, 90, 90, 90, 252, 252
), var1 = c(26, 21, 54, 10, 18, 9, 16, 54, 39), var2 = c(234,
12, 43, 32, 21, 19, 16, 34, 44)), .Names = c("id", "var1", "var2"
), row.names = c(NA, -9L), class …Run Code Online (Sandbox Code Playgroud)