R 数据结构的运算效率

2024-05-20

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

例如:

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

开发人员可能不想将自己与特定的实现联系起来,但如果能有比猜测更可靠的东西继续下去就好了。

另外我还知道主要的R性能提示是尽可能使用向量操作,而不是loops.

  • 各种口味怎么样apply?
  • 那些只是hidden loops?
  • 关于什么matrices vs. data frames?

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

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

2、read.table的性能(read.csv、read.delim 等)是将数据导入 R 的最常见方法,只需选择退出 read.table 的一些默认参数即可将其改进 5 倍(根据我的经验,通常会提高很多) --R 的帮助 (?read.table) 中提到了对性能影响最大的那些。简而言之,R 开发人员告诉我们,如果您为参数“colClasses”、“nrows”、“sep”和“comment.char”提供值(特别是,如果您知道文件以 headers 或第 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)}  

注意:您不能将此代码片段作为参数传递,您必须先调用它,然后传递返回的值——换句话说,调用函数,将返回的值绑定到变量,然后传递变量作为调用 read.table 中参数“colClasses”的值:

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

4.使用R的容器用于持久性代替普通文件格式(例如“txt”、“csv”)。 R 的本机数据文件“.RData”是一种二进制格式,比压缩的(“.gz”)txt 数据文件稍小。您使用以下命令创建它们save(,)。您可以使用以下命令将其加载回 R 命名空间load()。与“read.table”相比,加载时间的差异是巨大的。例如,w/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 表达式中的数字被解释为双精度浮点,例如,> typeof(5) 返回“double. ”比较每个合理大小的数组的对象大小,您可以看到其重要性(使用 object.size())。因此,尽可能强制转换为整数。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 数据结构的运算效率 的相关文章

随机推荐

  • 如何以xamarin形式使用消息中心

    我正在尝试使用消息中心而不是 xamarin 表单中的 Messenger 我不知道消息中心 我尝试使用以下代码以 xamarin 表单订阅和发送消息 MessagingCenter Send this TodoTable Todo 但我不
  • Jenkins 共享库:“java.lang.NoSuchMethodError:没有这样的 DSL 方法”

    我正在尝试通过 Jenkinsfile 和共享库创建 Jenkins 管道 我通过 Web UI 创建了一个作业来获取 Jenkinsfile 它工作正常 但是 共享库内容似乎无法被 Jenkins 识别 下面是 Jenkinsfile 和
  • 链路范围 IPv6 多播数据包突然无法在 MacBook Pro 上路由?

    这是一个有点晦涩的问题 但我很困惑 我想也许有人对这个问题有更多的线索 我的同事已经在他的 MacBook Pro 上成功运行了一个使用 IPv6 多播的内部应用程序几个月了 但今天 Mac 决定停止路由多播数据包 特别是 该程序打印此错误
  • MS Teams 应用程序:访问此应用程序时出现问题

    The users on MS Teams desktop reported multiple issues with our MS Teams app They see the following error on MS Teams De
  • WinForms:如何确定窗口是否不再活动(没有子窗口具有焦点)?

    我的应用程序使用多个窗口 我想隐藏一个特定窗口 以防应用程序失去焦点 当活动窗口不是应用程序窗口时 source https stackoverflow com questions 466354 how can i tell if a wi
  • 在C语言中使用“void”

    我很困惑为什么我们需要通过void转换为 C 函数 int f void return 0 versus int f return 0 什么是正确的做法以及为什么 In C int f 是一种老式的声明 它说f需要固定但未指定数量和类型的参
  • 列表应该如何转换为具体的实现?

    假设我正在使用一个我不知道源代码的库 它有一个返回列表的方法 如下所示 public List
  • 如何在React中的Material-UI选择框中设置默认值?

    我在用选择框 https material ui com demos selects 来自材料用户界面 我想显示默认选择的 选择值 选项 但之后用户无法选择此选项
  • 具有子列表属性映射问题的自动映射器

    我有以下型号 Models public class Dish Required public Int64 ID get set Required public string Name get set Required public str
  • RSA OAEP、Golang 加密、Java 解密 -BadPaddingException:解密错误

    我正在尝试解密使用 RSA OAEP 在 Golang 中加密的字符串 但出现 BadPaddingException 解密错误 很难弄清楚我错过了什么 这是Golang加密方法 func encryptString rootPEM io
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 按百分比设置 bootstrap 模态身高

    我正在尝试制作一个带有主体的模态 当内容变得太大时 该主体会滚动 但是 我希望模式能够响应屏幕尺寸 当我将最大高度设置为 40 时 它没有任何效果 但是 如果我将最大高度设置为 400px 它会按预期工作 但不会响应 我确信我只是错过了一些
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • Azure VM 上的 MongoDb 连接超时

    将我的 Azure Web 应用程序连接到 Azure VM 上托管的 MongoDb 时 我遇到一些超时问题 2015 12 19T15 57 47 330 0100 I NETWORK Socket recv errno 10060 A
  • 基本的多对多sql选择查询

    我认为这应该很容易 但它却在逃避我 我的帐户和帐户组之间存在多对多关系 一个帐户可以位于零个或多个组中 因此我使用标准连接表 Accounts ID BankName AcctNumber Balance AccountGroups ID
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 为什么在 Python 2.4 中使用 Unicode 数据会出现 ASCII 编码错误,而在 2.7 中却不会?

    我有一个程序 当在 Python 2 7 中运行时 会生成正确的 Unicode 输出到标准输出 当在 Python 2 4 中运行时 我得到UnicodeEncodeError ascii codec can t encode chara
  • Facebook PHP SDK - 如何获取访问令牌?

    我正在尝试从我的应用程序在用户的 Facebook 墙上发帖 用户授予应用程序在他的墙上发布的权限 并且我在数据库中有用户ID 我需要自动发送帖子 而无需用户再次登录 我的代码是 try require once dirname FILE
  • 以编程方式将 TextView 添加到主屏幕小部件

    我想以编程方式将文本视图控件添加到我的主屏幕小部件 在下面的示例中 我使用 TextView 填充 Linearlayout 但是这里应该如何使用 RemoteView 它只接受 xml 资源布局作为参数 public class MyWi
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复