r - 使用 data.table 同时排序、行过滤和列选择

标签 r data.table

我试图在 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)]

没有 <- .类似于 := - 运营商如 dt[, new_val := value*2]它在不复制整个 data.table 的情况下创建新变量。

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

最佳答案

对于您的第一个问题,请尝试

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]]

关于r - 使用 data.table 同时排序、行过滤和列选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30606395/

相关文章:

r - 将多列乘以特定列

r - 如何在 R 中绘制约束

r - ggplot2:为Alpha设置(非线性)值

r - 当列名包含空格和特殊字符时从 data.table 包中读取?

R对数据表的特殊 reshape

r - 查找先前行中小于和大于 r 中当前行值的最接近值

r - 无循环匹配家庭伙伴

r - 如何在 R 中创建虚拟引用类?

r - 将 Tidymodels 进程映射到列表/分组依据或嵌套

R:如何使用RJDBC从oracle数据库下载blob数据?