问题标签 [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 回答
4171 浏览

performance - 使用 do.call 和 ldply 将一长串 data.frames(约 100 万)转换为单个 data.frame 时遇到问题

我知道这里有很多关于使用 do.call 或 ldply 将 data.frames 列表转换为单个 data.frame 的方法的问题,但这个问题是关于理解这两种方法的内部工作原理并试图找出原因我无法将几乎 100 万个具有相同结构、相同字段名称等的 df 列表连接到单个 data.frame 中。每个 data.frame 为 1 行 21 列。

数据开始是一个 JSON 文件,我使用 fromJSON 将其转换为列表,然后运行另一个 lapply 以提取列表的一部分并转换为 data.frame,最终得到一个 data.frames 列表。

我试过了:

但我不得不在让它运行长达 3 小时并且没有得到任何回报后终止该过程。

有没有更有效的方法来做到这一点?如何解决正在发生的事情以及为什么需要这么长时间?

仅供参考 - 我在带有 RHEL 的 72GB 四核服务器上使用 RStudio 服务器,所以我认为内存不是问题。会话信息如下:

0 投票
2 回答
19102 浏览

sql - 什么时候用R,什么时候用SQL?

我有一个中等大小的数据库,其中包含许多连接和查找表。

我对 R 比对 SQL 更熟悉,而且我使用的是 MySQL。

我的问题:

在什么时候停止增加 SQL 语句的复杂性以支持 R 中的数据子集功能(例如,、、、、merge等)在 R*apply中是有益的。maplydlply

一方面,SQL 的连接比选择每个表的所有内容并使用 Rmerge函数连接它们更容易。此外,在 SQL 中进行条件选择会减少必须导入 R 的数据量;但速度差异并不显着。

另一方面,与 R 语法相比,带有复杂 where 子句的大连接变得不那么容易理解。

下面我有一些未经测试的代码用于说明目的:我在有工作代码之前问这个问题,我的问题的答案不需要工作代码(尽管这总是值得赞赏的) - “最优雅的方法”,“最少行”或“X 的惊人实现”总是受到赞赏,但我特别感兴趣的是“最明智/实用/规范/基于第一原则”的基本原理。

我对哪些步骤应该使用 SQLwhere子句以及哪些步骤使用 R 更容易完成的一般答案感兴趣。

插图:

数据库描述

共有三个表:aabba并且每个表b都有一个主键id。它们具有由查找表 表示的多对多关系,该表ab包含字段ab.a_id并分别ab.b_id连接到a.id和。b.id两个表都有一个time字段,a 有一个group字段。

目标:

这是我想做的连接和子集的最小示例;

(MySQL对元素的命名,例如a.id相当于a$idR中的)

  1. 连接表ab使用,将与每个关联的ab多个值附加为新列;b.timea.id

    /li>
  2. 我不需要 b.time 的重复值,我只需要一个值b.max:对于b.time加入 each的重复值a.idb.maxb.time最接近但不大于的值a.time

    /li>
  3. 将值附加dt <- a.time - b.max到表中,例如,在 R 中,
  4. 对于 中的每个不同值a.group,选择 which(min(x.dt)))

    /li>
0 投票
3 回答
4913 浏览

r - “循环”data.table 以计算条件平均值

我想“遍历” data.table 的行并计算每行的平均值。平均值应根据以下机制计算:

  1. 在第 i 行查找标识符 ID (ID(i))
  2. 在第 i 行查找 T2 的值 (T2(i))
  3. 计算满足这两个标准Data1的所有行中的值的平均值:和jID(j) = ID(i)T1(j) = T2(i)
  4. 在第 i 行的 Data2 列中输入计算的平均值

    /li>

对于这个简单的示例,结果应如下所示:

我认为这样做的一种方法是遍历行,但我认为这是低效的。我已经查看了该apply()功能,但我确定它是否可以解决我的问题。如果这会使它更有效或更容易,我也可以使用data.frame而不是。data.table真实数据集包含大约 100 万行。

0 投票
4 回答
26762 浏览

r - 从 data.table 中按字符串获取列

raw是 adata.table并且以下代码有效:

现在我想从一个字符串中指定这些列,例如:

现在如何在通过字符串引用列的同时实现与上述相同的效果?

不起作用,当然是因为我需要某种“取消引用”。我不知道在帮助和互联网中搜索什么,很抱歉这个愚蠢的问题。

0 投票
1 回答
6441 浏览

sql - 将外键上的 SQL 连接转换为 R data.table 语法

data.table包提供了许多与 SQL 相同的表处理方法。如果一个表有一个键,则该键由一个或多个列组成。但是一张表不能有多个键,因为它不能同时以两种不同的方式排序。

在这个例子中,XYdata.table带有单个键列“id”的 s;Y还有一个非键列“x_id”。

以下语法将在其键上连接表:

如何将以下 SQL 语法转换为 data.table 代码?

我得到的最接近的是:

但是,这与 SQL 语句执行的内连接不同。


这是一个更清晰的示例,其中外键是 y_id,我们希望连接查找 Y2 where 的值X2$y_id = Y2$id

我想制作表格:

类似于以下 kludge 所做的事情:

但是,当我这样做时:

我没有得到想要的结果:

0 投票
2 回答
6803 浏览

r - 连接 data.frame 或 data.table 中的匹配列

我有以下data.frames:

注意:两个表中都没有定义 v1 或 v2 的 id;对于每个 id 值,每列中只有一个唯一的非 NA 值

我想在“id”的匹配值上合并这些数据框:

但我也想将两列v1和结合起来v2,使 data.frameab看起来像这样:

相反,我得到了这个:

data.frame同时使用和的示例会很有帮助data.table,因此这里是上面的 data.table 版本:

0 投票
4 回答
350 浏览

r - 重塑数据(一种更快的方法)

我遇到了一张频率表。今天很重要,我不得不扩展为原始值的数据框。我能够做到,但想知道是否有更快的方法使用 reshape 包或 data.table?

原始表格如下所示:

这是使用 dput 轻松获取数据的示例:

我重塑数据的方法(有更快的方法吗?):

我认为这是一个常见问题,因为当您想从文章中获取表格并复制它时,它需要一些拆包。我发现自己越来越多地这样做,并希望确保自己有效率。

0 投票
1 回答
461 浏览

r - data.table 中的 groupBy:使用第一个值

data.table在 R 中有一个巨大的包含实验结果的内容:对于每个结果,运行的 id 和配置参数包含在另外两行中。conf每次运行的参数都是恒定的。请参阅此简化示例:

我想计算每次运行的值的平均值,我可以使用:

我还想将conf值添加到聚合中的每一行。事实上,我也可以通过使用列的mean功能来获得这个结果conf。但是:这是没用的,因为每个 runId 的 conf-value 根本不会改变:

这里有这个hacky mean-function的另一种选择吗?我可以用来聚合的“第一个”函数(或“最后一个”,在这种情况下不介意)之类的东西?

0 投票
2 回答
962 浏览

r - 如何使用 R 的 data.table 包对键值的否定进行子集化?

R 的data.table包提供了基于键的快速子集值。

因此,例如:

将返回 df1 中 group == "a" 的所有行。

如果我想要df1where 中的所有行怎么办group != "a"。是否有简洁的语法使用data.table

0 投票
4 回答
440 浏览

r - 使用相似数据框的内容来提高更新大数据框内容的性能

我正在寻找一种通用解决方案,用于使用第二个类似数据帧的内容更新一个大数据帧。我有几十个数据集,每个都有数千行和超过 10,000 列。“更新”数据集将与其相应的“基础”数据集重叠,按行排列从百分之几到大约 50%。数据集有一个“键”列,在任何给定的数据集中,每个唯一键值只有一行。

基本规则是:如果给定单元格的更新数据集中存在非 NA 值,则将基础数据集中的相同单元格替换为该值。(“相同单元格”表示“键”列和列名的相同值。)

请注意,更新数据集可能包含我可以使用 rbind 处理的新行(“插入”)。

因此,给定基本数据框“df1”,其中“K”列是唯一键列,“P1”..“P3”代表 10,000 列,其名称从一对数据集到下一个数据集会有所不同:

...和更新数据框“df2”:

我需要的结果如下,其中“B”和“C”的 1 被 2 覆盖,但未被 NA 覆盖:

这似乎不是一个合并候选者,因为合并给了我重复的行(相对于“键”列)或重复的列(例如 P1.x、P1.y),我必须对其进行迭代才能以某种方式折叠.

我已经尝试使用最终行/列的维度预先分配一个矩阵,并用 df1 的内容填充它,然后迭代 df2 的重叠行,但我无法获得优于每秒 20 个单元格的性能,需要数小时完成(与 SAS 中等效的 DATA 步 UPDATE 功能的分钟相比)。

我确定我遗漏了一些东西,但找不到可比较的例子。

我看到 ddply 用法看起来很接近,但不是通用解决方案。该data.table软件包似乎没有帮助,因为对我来说这是一个连接问题并不明显,至少通常不会超过这么多列。

此外,仅关注相交行的解决方案就足够了,因为我可以识别其他行并将它们绑定到其中。

下面是一些代码来制作上面的数据框:

谢谢