【问题标题】:R: data.table function row insert failsR:data.table 函数行插入失败
【发布时间】:2025-12-13 23:40:01
【问题描述】:

几个小时以来,我一直在努力完成以下任务:

我有一个数据表:

dt1 <- data.table(a = c(1:4), b = c(2:5), c= c(5:8))

还有一个功能:

myfun <- function(a, b, c) {
  r <- 30

  dt2 <- data.table(temp_int = seq(-10,50, by = 0.05))
  dt2[, d   := a * temp_int]
  dt2[, e   := b / temp_int]
  dt2[, f   := c + temp_int]
  dt2[, g   := d - e - f]
  # return row where g nearest to 0
  dt2[g == min(abs(g)), ]
}

如果我用测试值测试函数,一切都很好,我会得到一个合理且预期的答案。

但是当我尝试如下调用函数时:

dt1[, c('d','e','f','g') := myfun(a,b,c)]

我收到如下错误消息:

In addition: Warning messages:
1: In a * temp_int :
   longer object length is not a multiple of shorter object length
2: In b/temp_int :
   longer object length is not a multiple of shorter object length

数据表如下:

> dt1
   a b c    d    e  f   g
1: 1 2 5 -0.5 -1.5 -8 6.5
2: 2 3 6 -0.5 -1.5 -8 6.5
3: 3 4 7 -0.5 -1.5 -8 6.5
4: 4 5 8 -0.5 -1.5 -8 6.5

所以基本上每一行都填充了相同的结果(从第一次计算开始)。我很难理解这个问题。我必须在返回之前从数据表中转换结果吗?

【问题讨论】:

  • 欢迎来到 Stack Overflow!请随时使用该站点的tour,如果您需要该站点的其他帮助,请查看this。哦,如果您遇到帮助页面未涵盖的问题,请随时通过meta 提问。
  • 您将 a、b、c 值的向量传递给函数。如果传递向量,则测试函数在 data.table 之外返回的内容。
  • 感谢您的评论。在那之后,睡个好觉,我终于知道我哪里出错了。

标签: r function data.table


【解决方案1】:

我不需要调用函数并从数据表中传递向量,而是需要稍微修改调用:

dt1[, c('d','e','f','g') := myfun(a,b,c), by = 1:nrow(dt1)]

基本上是逐行调用函数。

有什么建议可以加快速度吗?是否可以? (真实的数据和计算会更大更复杂)

【讨论】: