使用data.table变量作为嵌套列表上的函数参数

时间:2018-04-11 01:58:23

标签: r data.table

提供此示例,我想根据变量b确定的长度计算变量a中列表内的值的总和。 请考虑以下可重现的示例:

require(data.table)

dt <- data.table(a = 1:4)
dt[, b:= .(list(1:6))]

现在我要计算这样的事情:

dt[, c:= sum(b[[1]][1:a])]

当然,这会产生警告信息,结果与预期不同。

我也尝试使用apply,但由于尝试了NA / NaN操作而返回错误:

dt[, c := apply(.SD, 1, function(x) sum(x[1][[1]][1:x[2]]))]

我的预期结果是:

> dt
   a           b  c
1: 1 1,2,3,4,5,6  1
2: 2 1,2,3,4,5,6  3
3: 3 1,2,3,4,5,6  6
4: 4 1,2,3,4,5,6 10

我怎样才能做到这一点?

(对于好奇:我尽力提供一个可重复的例子。实际数据包括预测从仓库中交付的物品数量,该物品存储在列表变量中,以及补充所需的天数从第一天到第n天的预测总和(提前期)是供应过程需要再次开始的项目数 - 再订购点 - 。

######编辑添加#####

考虑以下情况:

dt <- data.table(a = c(1, 3, 3, 4), b = c(list(1:6), list(2:7), list(3:8), list(4:9)))

预期结果将是:

dt[, c]
# 1 9 12 22

1 个答案:

答案 0 :(得分:2)

由于操作是行式的,我们可以使用mapply而不是按行分组:

dtt[, newCol := mapply(function(x, y) sum(y[1:x]), a, b)]

我个人不会使用cdt来表示变量或列名。