【问题标题】:R data.table max of current and all previous rowsR data.table 当前和所有先前行的最大值
【发布时间】: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。您是说对于每一行,从上一行中取 c2result 的最大值。但是,前一行的result 只是它之前所有行的最大值(cummax)。至少对我来说,这里要注意的重要一点是result 列永远不会小于累积最大值。它也永远不会更大,因此它必须相等。

标签: r data.table


【解决方案1】:

您可以利用data.table 的链接:

# load package
require(data.table)

# create dummy data
sampleDT <- data.table(c1 = c(1,2,3), c2 = c(7,5,6))

# run code
sampleDT[, result := shift(apply(.SD, 1, max)), 
           .SDcols = 1:2][, result := shift(apply(.SD, 1, max, na.rm = TRUE)), 
                            .SDcols = 1:3][]

>
   c1 c2 result
1:  1  7     NA
2:  2  5      7
3:  3  6      7

【讨论】:

    猜你喜欢
    • 2022-01-21
    • 1970-01-01
    • 2020-05-14
    • 2022-08-23
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多