2016-05-09 1 views
1

В настоящее время я делаю следующее на своих данных. Table dat, который больше всего участвует в моем коде.более быстрый способ нахождения max/min данного столбца для каждого значения другого столбца, а затем подмножество к этим строкам

dat[ , max_ts:= max(TS, na.rm = T), .(col_new)] 
dat_new <- dat[TS == max_ts, ] 

Что я делаю выше, что первым я найти максимум TS для каждого значения/категории колонок col_new, а затем держать только те строки, где происходит что максимальная TS.

Моя цель состоит в том, чтобы достичь dat_new

мне нужно сделать выше для различных таблиц данных в цикле. (Здесь немного сложно сократить время, поэтому, пожалуйста, ничего не предлагайте здесь)

Я ищу сделать более двух шагов в несколько быстрее. Есть ли лучший и эффективный способ сделать то же самое?

+2

Пожалуйста, покажите воспроизводимый пример – akrun

ответ

2

Мы можем использовать .I, чтобы получить индекс строки и подмножество строк на основе этого. Это должно быть быстрее.

dat[dat[ , .I[which.max(TS)], .(col_new)]$V1] 

Здесь я предполагаю, что нет связи для max. Если есть, то

dat[dat[, .I[TS == max(TS, na.rm=TRUE)], .(col_new)]$V1] 
+0

бы приказывать его и с «последним» значением предлагает любую скорость? 'dat [order [TS], .I [.N], by =. (col_new)] $ V1]' - Я полагаю, это не будет обрабатывать 'NA's ... – SymbolixAU

+0

@Symbolix Я думаю, используя 'setorder' с' .I' будет быстрее. Но, если есть связи, тогда он получит только одну строку для каждого «col_new» – akrun

+0

@akrun, в моем случае будут связи, но я хочу сохранить только первый случай, появляющийся для этих случаев. Таким образом, вы можете оптимизировать свое решение дальше, используя 'setorder'as, о котором вы упомянули. – user3664020