在R中,因子是否以某种方式节省空间?



如果您有一个.csv文件,其中大多数变量的大多数值都是重复的,那么该文件的最终文件大小将不会很小,因为没有压缩。但是,如果将.csv文件读入R,并将适当的变量强制转换为因子,那么在数据帧或文件上是否会有某种压缩好处?因子在数据帧或代码中的重复似乎是压缩的好机会,但我不知道这是否真的发生。

我试着在网上搜索这个,但是我没有找到答案。我不确定在哪里寻找实现因子的方式。

您正在寻找的文档在?factor帮助页面:

factor返回一个类"factor"的对象;它有一组整数代码,x的长度带有' level ';模式字符和唯一(!anyDuplicated(.))条目的属性。

所以一个因子实际上只是一个integer向量,以及整数和它的标签/级别之间的映射(存储为属性)。如果有重复的话,空间效率会很高!

然而,后面我们看到:

注意

在早期版本的R中,即使只有很小比例的重复,也可以将字符数据存储为一个因子,从而提高空间效率。但是,相同的字符串现在共享存储,因此在大多数情况下差异很小。(整数值存储在4字节中,而对字符串的每次引用需要一个4或8字节的指针。)

所以,在旧版本的R因子可以更有效地利用空间,但新版本优化了character向量存储,所以这个差异不是那么大。

我们可以看到当前的差异:

n = 1e6
char = sample(letters, size = n, replace = T)
fact = factor(char)
object.size(char)
# 8001504 bytes
object.size(fact)
# 4002096 bytes

最新更新