当前位置: 首页 > 知识库问答 >
问题:

加速data.table中的逐行操作

归鸿朗
2023-03-14

与数据帧相比,我对使用< code>data.table的< code>tapply类操作的速度提升印象极为深刻。

例如:

df = data.frame(class = round(runif(1e6,1,1000)), x=rnorm(1e6))
DT = data.table(df)

# takes ages if somefun is complex
res1 = tapply(df$x, df$class, somefun) 

# takes much faster 
setkey(DT, class)
res2 = DT[,somefun(x),by=class] 

然而,我并没有完全设法让它比应用类操作中的数据帧工作得更快(即,需要将函数应用于每一行的情况)。

df = data.frame(x1 = rnorm(1e6), x2=rnorm(1e6))
DT = data.table(df)

# takes ages if somefun is complex
res1 = apply(df, 1, somefun) 

# not much improvement, if at all 
DT[,rowid:=.I] # or: DT$rowid = 1:nrow(DT)
setkey(DT, rowid)
res2 = DT[,somefun1(x1,x2),by=rowid] 

这真的只是意料之中还是有一些技巧?

共有2个答案

傅越
2023-03-14

使用<code>set</code>可能会大大提高行操作的速度。这里有一个很好的基准:数据中的行操作。使用“by=.I”的表格`

东郭翰音
2023-03-14

如果你不能向量化你的函数(因为递归...)然后您就进入了< code>Rcpp的领域。使用< code>Rcpp和< code>data.table的通常规则是

  1. 相应地调整您的数据表设置键...)
  2. 写你 C?C 函数说 f,这将采取一个 Rcpp::D ataFrame 并返回一个 Rcpp::列表
  3. 通过引用进行更新 cppOut 列表

这样做通常会让你节省几个数量级

 类似资料:
  • 我有一个很大的数据表,其中每一行都需要基于完整数据表的一部分进行计算。作为一个例子,考虑下面的数据表,并假设每一行的I都需要计算当前行的id2与id1匹配的每一行的num变量之和,以及当前行的时间变量在距离当前行的时间1的范围内。 这可以通过像这样循环每一行来轻松完成 生成的 data.table 如下所示: 什么是正确的/快速的方法来做这样的事情使用data.table?

  • 如果有一个数据帧,并希望根据行的值对函数中的数据进行一些操作。 有谁知道如何将我的udf应用于数据帧?

  • 问题内容: 我试图在按下按钮时逐渐提高精灵速度,而不是仅移动恒定速度。同时设置最大速度限制。我希望你明白我的意思。 问题答案: 您的示例代码有很多(最初)错误。 您正在覆盖该方法。建议您改写该方法。如果您要覆盖顶级容器(如)的方法,则建议您不要这样做。相反,使用类似的东西作为自定义绘画的基础… 您正在处理过去的上下文。这是非常危险的,因为这样可以防止其他东西被涂上。该上下文是一个共享资源,一切都需

  • 问题内容: 我一直在尝试找出如何 逐渐 加速按下键时的精灵,然后一旦释放键,就逐渐减速直至停止,就像 小行星上 的飞船一样。如果可能,我想在没有任何游戏引擎的情况下执行此操作。我搜索了所以这个时候,发现相关的问题,但他们并没有回答我的问题 恰好 在我看来。 到目前为止,我想到的是: 我只是不确定如何正确地编程,因为我只能想到以相同的值增加而在持有时不会逐渐加速的方法。 所以这是我的目标( 逐渐加快

  • 我不完全确定我该做什么了。我一直在网上到处乱翻东西,通读例子,但它们似乎都是如何加密一整个文件,或者只是加密一段数据,除了立即再次解密之外什么也不做。我该如何处理逐行书写?

  • 我是一名教师,希望正确使用<code>数据。表在<code>R 以下是MWE: 我的问题在于什么是正确的在<code>j,特别是当我们依赖另一个表时? 如下所示,问题1和问题2都有多个可能的正确答案。 虽然正确的列计算无误,但还是有些地方不对:例如,当< code >学生b回答问题时,他得到了正确的分数,尽管他回答错误。只有< code>correct列中的一些条目是关闭的,这使我相信我不明白变量