r - Simultaneous order, row-filter and column-select with data.table -
i trying multiple steps in 1 line in r select value data.table (dt) multiple criteria.
for example:
set.seed(123) dt <- data.table(id = rep(letters[1:2],2), time = rnorm(4), value = rnorm(4)*100) # id time value # 1: -0.56047565 12.92877 # 2: b -0.23017749 171.50650 # 3: 1.55870831 46.09162 # 4: b 0.07050839 -126.50612 # want select last (maximum time) value id == "a" # pseudo data.table code looks dt[order(time) & id == "a" & .n, value] # [1] 12.92877 46.09162
instead of getting 2 values want last value (which has higher time-value).
if step-by-step works:
dt <- dt[order(time) & id == "a"] dt[.n, value] # [1] 46.09162
bonus:
how can order data.table without copying data.table: ie
dt <- dt[order(time)]
without <-
. similar :=
-operator such in dt[, new_val := value*2]
creates new variable without copying whole data.table.
thank you, idea appreciated!
for first question, try
dt[id == "a", value[which.max(time)]] ## [1] 46.09162
for bonus question, try setorder
function order data in place (you can order in descending order adding -
in front of time
)
setorder(dt, time) dt # id time value # 1: -0.56047565 12.92877 # 2: b -0.23017749 171.50650 # 3: b 0.07050839 -126.50612 # 4: 1.55870831 46.09162
also, if ordering data time, both - order reference , select value
condition- in single line
setorder(dt, time)[id == "a", value[.n]]
Comments
Post a Comment