【发布时间】:2019-02-14 00:57:50
【问题描述】:
我有一个名为“sampleDT”的 data.table,其中包含 c1 和 c2 列
require(data.table)
sampleDT <- data.table(c1 = c(1,2,3), c2 = c(7,5,6), result = c(NA, 7, 7))
print(sampleDT)
> print(sampleDT)enter code here
c1 c2 result
1: 1 7 NA
2: 2 5 7
3: 3 6 7
我想创建一个新列“结果”;并且值是从上一行中取最大值:
- “结果”列的第一行将不可避免地为 NA;
- 第二行将给出 7;
- 第三行也会给出 7,因为
sampleDT[2,result] == 7。
我们显然可以使用for循环来实现它;我想知道是否有更快的解决方案? (注意:不确定shift 是否有效,因为结果取决于上一行。
【问题讨论】:
-
如果您只是想要当前行和上一行的最大行数,那么是的,您可以使用
shift(),只需在当前行和前一行(移位)中取最大值。但是当你说“第 3 行也会给出 7,因为sampleDT[2,result] == 7”时,实际上你可以排除result列,但要么对c1, c2执行无限行回溯,要么使用 for-loop 评估它。 -
也许是
sampleDT[, result := cummax(c2)]; set(sampleDT, 1L, "result", NA)[] -
相关:this answer 使用
pmax() -
你表达这个问题的方式我相信这是一个简单的
cummax。您是说对于每一行,从上一行中取c2和result的最大值。但是,前一行的result只是它之前所有行的最大值(cummax)。至少对我来说,这里要注意的重要一点是result列永远不会小于累积最大值。它也永远不会更大,因此它必须相等。
标签: r data.table