gpt4 book ai didi

r - R 数据结构上的操作效率

转载 作者:行者123 更新时间:2023-12-03 10:53:37 25 4
gpt4 key购买 nike

我想知道 R 中是否有任何关于操作效率的文档,特别是与数据操作相关的那些。

例如:

  • 我想将列添加到数据框中很有效,因为我猜您只是将元素添加到链表中。
  • 我想添加行会更慢,因为向量保存在 C level 的数组中。你必须分配一个长度为 n+1 的新数组并复制所有元素。

  • 开发人员可能不想将自己与特定的实现联系起来,但如果有一些比猜测更可靠的东西会很好。

    另外,我知道主要的 R性能提示是尽可能使用向量操作,而不是 loops .
  • apply的各种口味怎么样? ?
  • 那些只是hidden loops ?
  • matrices 呢?与 data frames ?
  • 最佳答案

    数据 IO 是我在致力于学习 R 之前研究的功能之一。无论好坏,以下是我对这些问题的观察和解决方案/缓解措施:

    1. R 不处理大数据 (> 2 GB?)对我来说,这是用词不当。默认情况下,通用数据输入函数会将您的数据加载到 RAM 中。不要油嘴滑舌,但对我来说,这是一个功能而不是错误——只要我的数据适合我的可用 RAM,那就是我想要的地方。同样,SQLite 最受欢迎的功能之一是内存选项——用户可以轻松地将整个 dB 加载到 RAM 中。如果您的数据不适合内存,那么 R 通过连接到常见的 RDBMS 系统(RODBC、RSQLite、RMySQL 等)、通过 filehash 包等简单选项以及通过当前技术/实践的系统(例如,我可以推荐ff)。换句话说,R 开发人员选择了一个合理的(并且可能是最优的)默认值,从中很容易选择退出。

    2、read.table的性能 (read.csv、read.delim 等),将数据导入 R 的最常用方法,只需选择退出 read.table 的一些默认参数,就可以提高 5 倍(根据我的经验,通常会更多) -- R's Help (?read.table) 中提到了对性能影响最大的那些。简而言之,R 开发人员告诉我们,如果您为参数“colClasses”、“nrows”、“sep”和“comment.char”提供值(特别是,如果您知道文件以 header 开头或第 1 行的数据),您将看到显着的性能提升。我发现这是真的。

    以下是我用于这些参数的片段:

    要获取数据文件中的行数(在调用 read.table 时将此代码段作为参数“nrows”提供给参数):

    as.numeric((gsub("[^0-9]+", "", system(paste("wc -l ", file_name, sep=""), intern=T))))

    要获取每列的类:
    function(fname){sapply(read.table(fname, header=T, nrows=5), class)}  

    注意:你不能把这个片段作为参数传入,你必须先调用它,然后传入返回的值——换句话说,调用函数,将返回的值绑定(bind)到一个变量,然后传入变量作为调用 read.table 中参数“colClasses”的值:

    3. 使用扫描 .只需稍微麻烦一点,您就可以通过使用 'scan' 而不是 'read.table' 做得更好(优化 'read.table')('read.table' 实际上只是 'scan' 的包装)。再一次,这很容易做到。我使用“扫描”单独输入每一列,然后在 R 中构建我的 data.frame,即 df = data.frame(cbind(col1, col2,....))。

    4. 使用 R 的容器 用于代替普通文件格式(例如,“txt”、“csv”)的持久性。 R 的原生数据文件 '.RData' 是一种二进制格式,比压缩的 ('.gz') txt 数据文件小一些。您可以使用 创建它们保存 (, )。使用 将其加载回 R 命名空间加载 ()。与“read.table”相比,加载时间的差异是巨大的。例如,带有 25 MB 文件(未压缩大小)
    system.time(read.table("tdata01.txt.gz", sep=","))
    => user system elapsed
    6.173 0.245 **6.450**

    system.time(load("tdata01.RData"))
    => user system elapsed
    0.912 0.006 **0.912**

    5.注意数据类型通常可以提高性能并减少内存占用。这一点在从 R 中获取数据时可能更有用。这里要记住的关键点是,默认情况下,R 表达式中的数字被解释为 double 浮点,例如 > typeof(5) 返回 "double. "比较每个大小合理的数组的对象大小,您可以看到意义(使用 object.size())。因此,尽可能强制转换为整数。

    最后,'apply' 系列函数(以及其他)不是“隐藏循环”或循环包装器。它们是用 C 语言实现的循环——在性能方面差别很大。 [编辑:AWB 已经正确指出,虽然 'sapply'、'tapply' 和 'mapply' 是用 C 实现的,但 'apply' 只是一个包装函数。

    关于r - R 数据结构上的操作效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1971323/

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