17

我有一个 2.5 GB 的数据集,这对于我的 4GB 内存来说是相当大的。我想知道将字符变量转换为因子是否会节省空间和处理时间。

我想在内部,因子将以数字形式存储,并带有一个级别的查找表。但我不确定它实际上是如何工作的。

4

2 回答 2

18

转换为因子不会节省空间,因为字符存储在哈希表中。请参阅第1.10 节R InternalsCHARSXP 缓存

如果您的代码需要转换为因子(运行回归、分类等),则转换为因子可能会缩短处理时间,但如果您正在进行字符串操作,则不会提高处理时间,因为它必须转换因子回到一个角色。所以这真的取决于你在做什么。

于 2012-11-26T18:18:26.657 回答
7

在将数据写入磁盘时,将分类数据存储为因子而不是字符向量确实可以节省空间:

## Create 2 two-million length vectors, one character and one factor
animalsChar <- c(rep("giraffe", 1e6), rep("pygmy chimpanzee", 1e6))
animalsFac  <- factor(animalsChar)

## Save them to two ".Rdata" files
charFile <- "char.Rdata"
facFile <-  "fac.Rdata"
save(animalsChar, file = "char.Rdata")
save(animalsFac, file = "fac.Rdata")

## Compare the sizes of the two files
file.info("char.Rdata", "fac.Rdata")["size"]
#             size
# char.Rdata 87390
# fac.Rdata   7921


## Clean up
unlink(c("char.Rdata", "fac.Rdata"))
于 2012-11-26T18:35:51.913 回答