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