【问题标题】:Simultaneous order, row-filter and column-select with data.table使用 data.table 进行同时排序、行过滤和列选择
【发布时间】:2015-06-02 20:54:33
【问题描述】:

我试图在 R 中的一行中执行多个步骤,以从具有多个条件的 data.table (dt) 中选择一个值。

例如:

set.seed(123)
dt <- data.table(id = rep(letters[1:2],2),
             time = rnorm(4),
             value = rnorm(4)*100)

#    id        time      value
# 1:  a -0.56047565   12.92877
# 2:  b -0.23017749  171.50650
# 3:  a  1.55870831   46.09162
# 4:  b  0.07050839 -126.50612

# Now I want to select the last (maximum time) value from id == "a"
# My pseudo data.table code looks like this

dt[order(time) & id == "a" & .N, value]
# [1] 12.92877 46.09162  

我不想获取两个值,而是只获取最后一个值(具有更高的时间值)。

如果我一步一步做,它会起作用:

dt <- dt[order(time) & id == "a"]
dt[.N, value]
# [1] 46.09162

奖励:

如何在不复制 data.table 的情况下订购 data.table:即

dt <- dt[order(time)]

没有&lt;-。类似于:=-运算符,例如dt[, new_val := value*2],它创建新变量而不复制整个data.table。

谢谢,任何想法都非常感谢!

【问题讨论】:

  • 你说dt[order(time) &amp; id == "a"] 有效,但是order 给出的是一个整数,而不是一个逻辑,并且被简单地强制转换为TRUE,所以这相当于dt[TRUE &amp; id=="a"]dt[id=="a"]。您的示例是如此之小,以至于它看起来像它可以在这里工作。

标签: r data.table


【解决方案1】:

第一个问题,试试

dt[id == "a", value[which.max(time)]]
## [1] 46.09162

对于额外问题,请尝试setorder function,它将对您的数据进行排序(您也可以通过在time 前面添加- 以降序排序)

setorder(dt, time)
dt
#    id        time      value
# 1:  a -0.56047565   12.92877
# 2:  b -0.23017749  171.50650
# 3:  b  0.07050839 -126.50612
# 4:  a  1.55870831   46.09162

此外,如果您已经按时间对数据进行排序,则可以同时执行这两种操作 - 按引用排序并按条件选择 value - 在单行中

setorder(dt, time)[id == "a", value[.N]]

【讨论】:

    【解决方案2】:

    我知道这是一个较老的问题,但我想补充一点。有一个类似的问题我偶然发现了这个问题,虽然大卫阿伦伯格的回答确实为这个确切的问题提供了一个解决方案,但我在尝试从过滤和排序的 data.table 替换/覆盖值时遇到了麻烦,所以这里是另一种方法这还允许您将&lt;- 调用直接应用于过滤和排序的data.tabe。

    关键是 data.table 可以让您将多个[] 相互连接。

    例子:

    dt[id=="a", ][order(time), ][length(value), "value"] <- 0
    

    这也适用于多个条目,只需提供一个合适的向量作为替换值。

    但是请注意,.N 是一个列表对象,需要替换为例如列的长度,因为 data.table 需要在 i 中的这个位置有一个整数,而您要在 j 中选择的列需要用 "" 包装。

    我发现这是一种更直观的方式,它不仅可以让您过滤数据表,还可以操作其值而无需担心临时表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-08
      • 2020-06-18
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      相关资源
      最近更新 更多