问题标签 [data.table]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
90800 浏览

r - 如何进行 data.table 合并操作

注意:这个问题和以下答案是指 data.table 版本 < 1.5.3;v. 1.5.3 于 2011 年 2 月发布以解决此问题。查看更多最新处理(03-2012):将外键上的 SQL 连接转换为 R data.table 语法


我一直在研究data.table 包的文档(替代 data.frame 对某些操作更有效),包括Josh Reich 在 NYC R Meetup 上关于 SQL 和 data.table 的演示(pdf),但是无法弄清楚这个完全微不足道的操作。

文档说“当 [第一个参数] 本身是一个 data.table 时,调用类似于 base::merge 的连接,但在排序键上使用二进制搜索。” 显然情况并非如此。我可以使用 data.tables 将 y 中的其他列转换为 x[y] 的结果吗?似乎它只是取 x 的行,其中键与 y 的键匹配,但完全忽略了 y 的其余部分......

0 投票
4 回答
2576 浏览

r - 用 group-id 对数据进行子集化的 for 循环的更高性能替代方案是什么?

我在研究中遇到的一个反复出现的分析范式是需要根据所有不同的组 id 值进行子集化,依次对每个组执行统计分析,并将结果放入输出矩阵中以供进一步处理/汇总。

我通常如何在 R 中执行此操作类似于以下内容:

这最终对我有用,但根据数据的大小和我正在使用的组的数量,这可能需要长达三天的时间。

除了扩展到并行处理之外,还有什么“技巧”可以让这样的东西运行得更快吗?例如,将循环转换为其他东西(比如应用包含我想在循环内运行的统计信息的函数),或者消除将数据子集实际分配给变量的需要?

编辑:

也许这只是常识(或抽样错误),但我尝试在我的一些代码中使用括号进行子集化,而不是使用子集命令,它似乎提供了轻微的性能提升,这让我感到惊讶。我有一些使用与上面相同的对象名称在下面输出的代码:

更新:

在其中一个答案中,jorgusch 建议我使用 data.table 包来加快我的子集化。因此,我将其应用于本周早些时候遇到的一个问题。在一个有超过 1,500,000 行和 4 列(ID、Var1、Var2、Var3)的数据集中,我想计算每组中的两个相关性(由“ID”变量索引)。有50,000多个组。下面是我的初始代码(与上面非常相似):

我现在正在重新运行它,以准确衡量这需要多长时间,但据我所知,我早上进入办公室时开始运行它,并在下午中旬的某个时间结束。图 5-7 小时。

重组我的代码以使用 data.table....

将使用 data.table 的结果与我使用 for 循环对所有 ID 进行子集化并手动记录结果的结果进行比较,它们似乎给了我相同的答案(尽管我必须更彻底地检查一下)。这看起来是一个相当大的速度提升。

更新 2:

使用子集运行代码终于又完成了:

更新 3:

我想看看使用同样推荐的 plyr 包是否有任何不同的结果。这是我第一次使用它,所以我的工作效率可能有些低,但与带有子集的 for 循环相比,它仍然有很大帮助。

使用与以前相同的变量和设置...

0 投票
2 回答
3447 浏览

r - data.table 和“必须评估以列出”错误

我想使用 R 中的 data.table 包来动态生成聚合,但我遇到了错误。下面,让my.dt成为 类型data.table

如果我运行它,我会收到错误:

然而,以下工作没有错误:

我明白为什么会发生错误,但我看不到如何使用带有by参数的向量。

0 投票
2 回答
10942 浏览

performance - idata.frame:为什么错误“is.data.frame(df) is not TRUE”?

我正在使用 R 中一个名为 exp ( file here ) 的大型数据框。为了提高性能,建议我从 plyr 中检查 idata.frame() 函数。但我认为我用错了。

我原来的电话,很慢,但它有效:

使用 idata.frame,Error: is.data.frame(df) is not TRUE

所以,我想,也许这是我的数据。所以我尝试了baseball数据集。该idata.frame示例工作正常:dlply(idata.frame(baseball), "id", nrow)但如果我尝试使用类似于我想要的调用的东西baseball,它不起作用:

也许我的错误在于我如何指定分组?任何人都知道如何让我的例子工作?

预计到达时间:

我也试过:

它使用更快的方法来获取中位数,但给出了不同的错误。我认为我根本不了解如何使用 idata.frame。

0 投票
5 回答
49701 浏览

performance - 在 R 中合并/加入 data.frames 的最快方法是什么?

例如(不确定是否最具代表性的例子):

这是我到目前为止所得到的:

0 投票
4 回答
15536 浏览

r - R:如何在不耗尽内存的情况下绑定两个巨大的数据帧

我有两个数据框df1df2每个都有大约 1000 万行和 4 列。我使用 RODBC/sqlQuery 将它们读入 R 没有问题,但是当我尝试rbind它们时,我得到了最可怕的 R 错误消息:cannot allocate memory. 必须有更有效的方法来更有效地做事rbind——有人想分享他们最喜欢的技巧吗?例如,我在文档中找到了这个例子sqldf

这是最好的/推荐的方法吗?

更新 我使用dbname = tempfile()中的关键参数sqldf,正如 JD Long 在他对这个问题的回答中所建议的那样

0 投票
1 回答
5717 浏览

r - R:当使用 data.table 时,当我执行 x[y] 时如何获得 y 列?

更新:老问题......它已在 2011 年 2 月由 data.table v1.5.3 解决。

我正在尝试使用该data.table软件包,并且真的很喜欢我得到的加速,但是当我使用相同的键执行x[y, <expr>]wherexyare “数据表”时,我被这个错误难住了,并且<expr>包含两个x和的列名y

更新...为了澄清我在上面的示例中寻找的功能:我需要执行以下等效操作:

但是,根据常见问题解答中的以下摘录data.table,这应该有效:

最后,虽然 x[y] 看起来好像没有返回 y 中的列,但您实际上可以在 j 表达式中使用 y 中的列。这就是我们所说的加入继承范围。为什么不只返回 x 和 y 中所有列的并集,然后对其运行表达式?它归结为代码的效率和编程速度更快。当您编写 x[y,foo boo] 时,data.table 会自动检查 j 表达式以查看它使用了哪些列。它只会对这些列进行子集或分组。仅为 j 使用的列创建内存。假设 foo 在 x 中,boo 在 y 中(以及 y 中的 20 个其他列)。x[y,foo boo] 不是比合并步骤后跟另一个子集步骤更快地编程和运行吗?

我知道这个问题解决了类似的问题,但似乎并没有得到令人满意的解决。有谁知道我错过了什么或误解了什么?谢谢。

更新:我在数据表帮助邮件列表中询问,包作者(Matthew Dowle)回答确实上面引用的常见问题解答是错误的,所以我使用的语法目前不起作用,即我无法引用(即第二个)我这样做时的论点。yjx[y,...]

0 投票
5 回答
692 浏览

r - 在多个不同的切片上应用聚合函数

我有一个数据数组,其中包含有关人员和项目的一些信息,例如:

我想用另外几个名为“first_time”和“first_time_project”的字段来扩充这些数据,它们共同识别该人第一次看到该人的任何操作以及该开发人员第一次看到对该项目的任何操作。最后,数据应如下所示:

我这样做的天真方法是编写几个循环:

现在,不需要天才就可以看到双重嵌套循环会变得非常缓慢。但是,我想不出在 R 中处理这个问题的方法。我有点模拟 SQL 的 group by 选项。我知道 by 可能会有所帮助,但我不知道如何做多个切片。

关于如何将我的代码从冰冷的速度提升到更快的任何提示?我现在对蜗牛很满意。

0 投票
2 回答
1322 浏览

r - R 中最快的 Tall-Wide 旋转

我正在处理一个简单的表格

对(日期,变量)是唯一的。我想把这张桌子变成一张宽幅桌子。

而且我想以最快的方式做到这一点,因为我必须在具有 1e6 条记录的表上反复重复该操作。tapply()在 R 原生模式下,我相信reshape()d*ply()都在速度方面由data.table. 我想针对基于 sqlite 的解决方案(或其他数据库)测试后者的性能。以前有这样做过吗?有性能提升吗?而且,当“宽”字段(日期)的数量是可变的并且事先不知道时,如何在 sqlite 中将高到宽转换?

0 投票
2 回答
2370 浏览

r - data.table 和字符向量

在我的工作中,我经常将变量列表称为一个字符向量。

只要有可能,我想使用vecvar而不是枚举变量,因为这使我的代码对未来的应用程序更加健壮,以适应稍微不同的变量列表。

我最近发现data.table,尽管我喜欢语法的一般优雅和效率提升,但我发现它与我上面概述的倾向有点冲突。确实,A[, vecvar]行不通。

我不确定解决此问题的最佳方法。

A[, vecvar, with=F]会工作,但并不总是方便(例如A[, list(vecvar, var1+var2), with=F]不会工作)。

A[, sapply(vecvar, get)]不会工作,虽然A[, sapply(vecvar, function(x) get(x))]会。

我没有被困住,因为我有办法处理它——我只想知道在我养成坏习惯之前最好的解决方法是什么!