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