r - Apply which.min to data.table under a condition -


i have data.table , need know index of row containing minimal value under given condition. simple example:

dt <- data.table(i=11:13, val=21:23)  #      val # 1: 11   21 # 2: 12   22 # 3: 13   23 

now, suppose i'd know in row val minimal under condition i>=12, 2 in case.

what didn't work:

dt[i>=12, which.min(val)] # [1] 1 

returns 1, because within dt[i>=12] first row.

also

dt[i>=12, .i[which.min(val)]] # [1] 1 

returned 1, because .i supposed used grouping.

what did work:

to apply .i correctly, added grouping column:

dt[i>=12, g:=true] dt[i>=12, .i[which.min(val)], by=g][, v1] # [1] 2 

note, g na i<12, which.min excludes group result.

but, requires computational power add column , perform grouping. productive data.table has several millions of rows , have find minimum often, i'd avoid computations.

do have idea, how efficiently solve this?

you can use fact which.min ignore na values "mask" values don't want consider:

dt[,which.min(ifelse(i>=12, val, na))] 

as simple example of behavior, which.min(c(na, 2, 1)) returns 3, because 3rd element min among non-na values.


Comments

Popular posts from this blog

php - Vagrant up error - Uncaught Reflection Exception: Class DOMDocument does not exist -

vue.js - Create hooks for automated testing -

Add new key value to json node in java -