gpt4 book ai didi

r - 决定哪些字符列应转换为因子的标准

转载 作者:行者123 更新时间:2023-12-04 09:39:52 25 4
gpt4 key购买 nike

我一直在阅读 Marchi 和 Albert 撰写的“用 R 分析棒球数据”一书,我想知道他们没有解决的一个问题。

我需要导入的许多数据集都相当大(虽然不是“大数据”意义上的“大”)。例如,Retrosheet Game Logs每年有 1 个可追溯到 1871 年的 csv 文件,其中每个文件都有一行代表当年玩的每个游戏,以及 161 列。当我使用 read.csv() 将其读入数据帧时使用 stringsAsFactors 上的默认设置161 列中的全部 75 列成为因子。其中一些列在概念上是因子(例如包含 "D""N" 用于白天或夜间比赛),但其他列可能最好保留为字符串(许多列包含起始投手、关闭者等的名称)我知道如何将列从因子转换为字符串,反之亦然,但我不想扫描 161 列,为其中的 75 列做出明确的决定。

我认为这很重要的原因是我注意到,考虑到需要保留完整的因素信息,通过对这些游戏日志进行子集化获得的概念上的小数据帧非常大。例如,给定数据帧 GL2016下载、解压、读取文件获得,object.size(GL2016)大约 2.8 MB,当我使用时:

df <- with(GL2016,GL2016[V7 == "CLE" & V13 == "D",])

为了提取 2016 年克利夫兰印第安人队的主场比赛,我得到了一个 26 行的 df。 26/2428(其中 2428 是整个数据帧中的行数)略高于 1%,但 object.size(df)大约是 1.3 MB,远远超过 GL2016 大小的 1% .

我想出了一个临时解决方案。我首先定义了一个函数:
big.factor <- function(v,k){is.factor(v) && length(levels(v)) > k}

然后用了 mutate_if来自 dplyr像这样:
GL2016 %>% mutate_if(function(v){big.factor(v,30)},as.character) -> GL2016

30 是 MLB 中的球队数量,我有些武断地决定,任何超过 30 级的因素都应该被视为一个字符串。

运行此代码后,因子变量的数量从 75 减少到 12。即使现在 GL2016 也能起作用。大约 3.2 MB(比以前略大),如果我现在对数据帧进行子集以提取克利夫兰日间比赛,结果数据帧仅为 0.1 MB。

问题:

1) 在导入大型数据集时,哪些标准(希望比我上面使用的更少)与决定哪些字符列应转换为因子相关?

2) 我知道将所有字符数据转换为因子的内存占用成本,但是当我将大多数这些因子转换回字符串时,我是否会产生任何隐藏成本(比如处理时间)?

最佳答案

基本上,我认为您需要做的是:

df <- with(GL2016,GL2016[V7 == "CLE" & V13 == "D",])
df <- droplevels(df)
droplevels函数将删除所有未使用的因子级别,从而减小 df 的大小。非常。

关于r - 决定哪些字符列应转换为因子的标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42820748/

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