【发布时间】:2019-09-21 15:15:40
【问题描述】:
简介
我正在尝试找到最佳方法,如何在给定列中找到具有非零值的最后一行,并在该行上返回不同列的值。我想在 R data.table 中执行此操作,并且正在寻找该操作的最大效率。
示例
让我们有一个像这样的数据表:
set.seed(123)
DT = data.table(x=rep(c("b","a","c"),each=6),
y=rep(1:6, 3),
z = rbinom(18, 1, 0.3))
这给了我们以下数据表:
x y z
1: b 1 0
2: b 2 1
3: b 3 0
4: b 4 1
5: b 5 1
6: b 6 0
7: a 1 0
8: a 2 1
9: a 3 0
10: a 4 0
11: a 5 1
12: a 6 0
13: c 1 0
14: c 2 0
15: c 3 0
16: c 4 1
17: c 5 0
18: c 6 0
现在,该表针对 x 列中的每个值按 y 列排序。对于由x 列中的值给出的每个组,我想创建一个列,该列将为我从最后一个非零值z 的行中为每一行提供y 的值。
现在我对每个 y 使用 lapply 并按 x 分组,这给出了所需的结果:
DT[, list(y,
z,
output = lapply(y, function(x) max(y[z != 0 & y <= x]))
),
by = 'x']
问题
我可以让示例中的代码更高效吗?
【问题讨论】:
-
我已经测试了下面建议的滚动连接和非 equi 连接,结果证明在我的场景中滚动连接更快。不能说是因为设置还是一般情况
标签: r data.table