在讨论将Date类列导入R时,有几件事:导入的速度,以及它是在转换之前首先作为字符串读取还是在运行中转换。 后者可能是一个因素(对于较大的数据),因为R的全局字符串池具有历史重要性,可能会阻碍较大的数据。请参阅Object size for characters in R - How does R global string pool work?,https://adv-r.hadley.nz/names-values.html#character-vectors和https://github.com/krlmlr/stringpool以获得更多关于它的讨论,但底线是,如果我们可以避免阅读许多我们知道不会作为字符串保存的字符串读入R,通常会更好。如果您的数据是1000行左右,您是否应该关心全局字符串池?大概不会当然,这并不是为了减少对它的暴露而牺牲舒适的代码和/或其他功能。 我将尝试一个粗略的测量:system.time(.)表示“导入速度”,ps::ps_memory_info()表示导入前后的驻留集大小(RSS)。 数据设置:
3条答案
按热度按时间ffvjumwh1#
在讨论将
Date
类列导入R时,有几件事:导入的速度,以及它是在转换之前首先作为字符串读取还是在运行中转换。后者可能是一个因素(对于较大的数据),因为R的全局字符串池具有历史重要性,可能会阻碍较大的数据。请参阅Object size for characters in R - How does R global string pool work?,https://adv-r.hadley.nz/names-values.html#character-vectors和https://github.com/krlmlr/stringpool以获得更多关于它的讨论,但底线是,如果我们可以避免阅读许多我们知道不会作为字符串保存的字符串读入R,通常会更好。如果您的数据是1000行左右,您是否应该关心全局字符串池?大概不会当然,这并不是为了减少对它的暴露而牺牲舒适的代码和/或其他功能。
我将尝试一个粗略的测量:
system.time(.)
表示“导入速度”,ps::ps_memory_info()
表示导入前后的驻留集大小(RSS)。数据设置:
对于每种导入机制,我都运行类似的代码,用特定包的变体替换
read.csv2
。预付款:这些是低强度基准。在单次运行中测量时间和内存消耗很容易导致其他一些外部/不相关的问题,因此对任何“小”差异都要持保留态度。更值得注意的是更大的(数量级)差异。
(Note最新版本的
readr
在幕后使用了vroom
。(For箭头,对于较大的数据,可以选择
as_data_frame=FALSE
,然后执行dplyrmutate
/filter
/select
/summarize
/...在collect
之前。支持的操作列表令人印象深刻,但它不接受任意/复杂的R表达式...但是如果您能够在将数据写入内存之前使用所支持的内容,则可以节省大量内存。)上面的所有调用都返回了文件第二列的类
Date
,它们都不需要用户代码来进行更改。然而...
基准测试描绘了一些不同的效率:
| func|经过|RSS|
| --|--|--|
| read.csv2 |61.665| 1185.97300|
| readr::read_delim|一千五百八十三|142.04300|
| vroom::vroom|零点八|410.83980|
| data.table::fread(colClasses)|五十七点四九二|1271.62900|
| data.table::fread(Idate)|0.285| 90.55078|
| arrow::read_delim_arrow|三百|477.17580|
read.csv2
和fread
(带有colClasses=
)显然是最慢的,这表明它们在内部使用原生R代码将字符串转换为Date
类列。它们各自的rss
数字支持它们首先作为字符串拉入R的概念。其他人认为,不仅基本的阅读速度提高,而且显着的记忆改善。
我将把它作为一个练习(和苦差事),让读者在每个函数/包中找到
as.Date
的使用/缺失。e4yzc0pl2#
根据(1)我们是否真的不知道哪些列是日期,(2)我们知道前两列是日期,(3)日期列是名称包含子字符串“dat”的列,或者(4)日期列是从
dat1
到second_dat
的列,包括它们之间的任何列,我们可以使用以下其中之一:有没有人回来
xtfmy6hx3#
您可以使用
across
沿着从dplyr
包中选择helper来更改多个变量:创建于2023-09-13带有reprex v2.0.2
还有其他一些辅助函数,请参见``dplyr::select`。