gpt4 book ai didi

r - 为什么在 R 中更改 stringsAsFactors 会更改文件大小?

转载 作者:行者123 更新时间:2023-12-02 03:19:36 26 4
gpt4 key购买 nike

我从 PostgreSQL 数据库中提取了一组数据,以便在 R 中使用它。在处理它的过程中,我经常被某些领域中的因素绊倒,而我不希望这些因素成为因素。因此,我返回到用于提取数据的代码,并确保设置了 options(stringsAsFactors = FALSE)

存储提取数据的原始 .RData 文件(五个表,加上一个存储数据提取时间的变量)大约为 800MB。更新版本中,字符串未作为因子存储,超过 2GB。除了将 stringsAsFactors 设置为 false 外,数据库或我的代码中没有任何变化。

我最初的怀疑是因子水平对于存储文本更有效,因为实际文本将作为水平存储一次,然后每个值将被分配给一个水平。但我认为这是不对的——我的理解是 R 中的因素 字符数据,结构在上面。因此,在那种情况下,我认为文件大小不会有任何有意义的差异。

那么,我的问题是:为什么将 stringsAsFactorsTRUE 更改为 FALSE 会以如此大的方式改变结果数据的大小?

最佳答案

将问题的评论整合为答案。

前面的底线:R 因子是带有附加标签的数值向量,它们使用字符运算和比较。这与 SAS 不同,在 SAS 中,类别是通过将独立因子应用于数值变量来创建的,并且使用数值运算和比较。

大体上,我最初怀疑因素是分配给设置文本字符串的数值是正确的。 SAS 和 R 处理此问题的方式存在一些差异,这是我提出问题的原因。

简而言之,SAS 允许您创建自定义格式并将其应用于数值数据。因此,如果您有存储在数字变量中的分类数据(例如,将种族分类为数字类别),您可以在使用字符串显示输出时保持该变量不变。

考虑 SAS 示例:

DATA sample;
INPUT id race;
DATALINES;
1 1
2 1
3 2
4 3
5 1
6 2
7 4
8 3
9 1
;
RUN;

PROC FORMAT;
VALUE raceft 1 = 'White'
2 = 'Black'
3 = 'Asian'
4 = 'Other';
RUN;

PROC PRINT DATA=sample;
FORMAT race raceft.;
RUN;

这个输出:

Obs    id    race
1 1 White
2 2 White
3 3 Black
4 4 Asian
5 5 White
6 6 Black
7 7 Other
8 8 Asian
9 9 White

但是,在此示例中,变量 race 仍然是数字。针对它的 SAS 操作使用数字类别和比较操作。例如,选择所有白人将使用 race = 1 操作完成。

相比之下,R 会将此数据存储为一个因素。请考虑以下事项。

sample <- data.frame(id = c(1:9),
race = c(1,1,2,3,1,2,4,3,1))
sample$race <- factor(x = sample$race,
levels = c(1:4),
labels = c("White","Black","Asian","Other"))

> sample
id race
1 1 White
2 2 White
3 3 Black
4 4 Asian
5 5 White
6 6 Black
7 7 Other
8 8 Asian
9 9 White

在这种情况下,变量 race 现在属于 factor 类,R 对其使用字符比较和操作。例如,选择其中的所有白人将使用某种 race = "White" 操作来完成。

尽管 R 对因子使用字符运算,但数据实际上并未存储为字符变量。因子的结构是:

> dput(sample$race)
structure(c(1L, 1L, 2L, 3L, 1L, 2L, 4L, 3L, 1L), .Label = c("White","Black", "Asian", "Other"), class = "factor")

这与 factor 的文档一致,其中指出:

factor returns an object of class "factor" which has a set of integer codes the length of x with a "levels" attribute of mode character and unique (!anyDuplicated(.)) entries. If argument ordered is true (or ordered() is used) the result has class c("ordered", "factor").

因此,R 实际上确实将因子存储为带有附加标签的数值。这样做可以减少存储许多采用少量离散值的记录时所需的存储空间。然而,尽管基础值是数字,R 在处理因子时使用字符运算符,而不是数字运算符。

关于r - 为什么在 R 中更改 stringsAsFactors 会更改文件大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34337460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com