因素与角色的效率 - 对象大小

问题描述 投票:0回答:1

我遇到了一些奇怪的事情。我一直认为,如果可能且有意义的话,将数据存储为因子变量将会带来更好的存储效率。

但是当我看到这个时:

object.size(c( "A", "B", "B", "0", "A", "AB", "0")) # 720 Bytes
gr <- factor(c( "A", "B", "B", "0", "A", "AB", "0"))
object.size(gr) # 336 Bytes

因子变量比字符需要更多的存储空间。那么我读到的有关存储效率的内容都是错误的吗?

有没有一个例子可以让初学者看到因子使用的优势?

r byte factors
1个回答
1
投票

粗略地说,因子是一个整数向量,具有列出类别名称的

levels
属性(字符向量)和告诉 R 它是一个因子的
class
属性(另一个字符向量)。

短因子往往比相同长度的字符向量需要更多内存,因为存储因子属性的成本远远抵消了由于存储整数而不是字符串而节省的成本。这是一个极端的例子来说明这一点:

x <- c("a", "b") f <- factor(x) class(f) # [1] "factor" unclass(f) # [1] 1 2 # attr(,"levels") # [1] "a" "b"

存储
f
需要存储整数向量

c(1L, 2L)

字符向量
c("a", "b")。在这种情况下,整数向量是完全冗余的,因为 c("a", "b")
 编码了我们首先需要的所有信息。
object.size(f)
# 568 bytes
object.size(x)
# 176 bytes

当关卡有大量重复时,存储因子会变得更加高效。
g <- gl(2L, 1e06L, labels = c("a", "b"))
y <- as.character(g)

object.size(g)
# 8000560 bytes
object.size(y)
# 16000160 bytes

需要记住的一些事情:

许多处理分类变量的 R 函数(

table
  • split
     等)会在对它们执行任何其他操作之前将字符向量参数转换为因子。因此,实际上使用分类变量进行操作几乎总是涉及将一个因素记入内存。
    因子清楚地向用户传达该变量是分类变量,而不仅仅是字符串序列。
  • 因此,有很多充分的理由选择因子,即使它们很短。

© www.soinside.com 2019 - 2024. All rights reserved.