Получить минимальное значение для каждой группы по нескольким подгруппам - PullRequest
0 голосов
/ 18 февраля 2019

Я использую R и у меня есть таблица данных, как показано ниже.Значения var1 и var2 связаны с контекстом (упорядочены по возрастанию var1 ) для каждой строки, в то время как var3 является совокупной суммой var3 для каждой группы ( g1 , g2 , g3 ). var4 - это переменная, разбитая на десятые доли в стеке (в данных по 10 строк на группу).

Проблема

РЕДАКТИРОВАТЬ: Для каждого значения var4 мне нужно вычислить минимум var1 из минимума всех var3 , то есть> = каждый var4 ?

У меня есть миллионы строк данных этого типа, поэтому производительность важна

Любая помощь будет принята с благодарностью

Старый вопрос: Для каждой строки: Если var4 <минимум всех <strong>var3 для группы, должен быть возвращен минимум всех var1 ,Если var4 > минимум всех var 3 , то минимум var1 из строк с максимальным значением var3 , то есть <= <strong>var4 должно быть возвращено.

g1(char) g2(POSIXct)          g3(int)  var1(num) var2(num) var3(num) var4(num)
A        01/01/2019 04:30:00  -30     -100       1661      1661       280
A        01/01/2019 04:30:00  -30        0          0      1661       560
A        01/01/2019 04:30:00  -30       57        720      2381       840
A        01/01/2019 04:30:00  -30       59          0      2381      1120
A        01/01/2019 04:30:00  -30       70          0      2381      1400
A        01/01/2019 04:30:00  -30       77          0      2381      1680
A        01/01/2019 04:30:00  -30       91         80      2461      1960
A        01/01/2019 04:30:00  -30       93          0      2461      2240
A        01/01/2019 04:30:00  -30       95          0      2461      2520
A        01/01/2019 04:30:00  -30       99        340      2801      2800

Ожидаемые результаты для одной группы будут выглядеть так:

g1(char) g2(POSIXct)          g3(int)  var1   var2   var3   var4  var5
A        01/01/2019 04:30:00  -30     -100    1661   1661    280  -100
A        01/01/2019 04:30:00  -30        0       0   1661    560  -100
A        01/01/2019 04:30:00  -30       57     720   2381    840  -100  
A        01/01/2019 04:30:00  -30       59       0   2381   1120  -100
A        01/01/2019 04:30:00  -30       70       0   2381   1400  -100
A        01/01/2019 04:30:00  -30       77       0   2381   1680    57
A        01/01/2019 04:30:00  -30       91      80   2461   1960    57
A        01/01/2019 04:30:00  -30       93       0   2461   2240    57
A        01/01/2019 04:30:00  -30       95       0   2461   2520    99
A        01/01/2019 04:30:00  -30       99     340   2801   2800    99

1 Ответ

0 голосов
/ 18 февраля 2019

Два возможных подхода с использованием :

# option 1
DT[, var5 := min(var1) * (var4 <= min(var3)), by = .(g1, g2, g3)
   ][, var5 := replace(var5, var5 == 0, min(var1)), by = .(g1, g2, g3, var3)][]

# option 2
DT[, var5 := min(var1) * (var4 <= min(var3)), by = .(g1, g2, g3)
   ][, var1min := min(var1), by = .(g1, g2, g3, var3)
     ][var5 == 0, var5 := var1min, by = .(g1, g2, g3, var3)
       ][, var1min := NULL][]

, которые оба дают:

> DT
    g1            g2  g3 var1 var2 var3 var4 var5
 1:  A 01/01/2019... -30   50 1000 1000  200   50
 2:  A 01/01/2019... -30   55    0 1000  400   50
 3:  A 01/01/2019... -30   57    0 1000  600   50
 4:  A 01/01/2019... -30   59  100 1100  800   50
 5:  A 01/01/2019... -30   70    0 1100 1000   50
 6:  A 01/01/2019... -30   77    0 1100 1200   59
 7:  A 01/01/2019... -30   91  200 1300 1400   91
 8:  A 01/01/2019... -30   93  250 1550 1600   93
 9:  A 01/01/2019... -30   95    0 1550 1800   93
10:  A 01/01/2019... -30   99  450 2000 2000   99

Использованные данные:

DT <- fread("g1   g2     g3  var1  var2  var3  var4  var5
A        01/01/2019...  -30      50    1000  1000   200  50
A        01/01/2019...  -30      55       0  1000   400  50
A        01/01/2019...  -30      57       0  1000   600  50
A        01/01/2019...  -30      59     100  1100   800  50
A        01/01/2019...  -30      70       0  1100  1000  50
A        01/01/2019...  -30      77       0  1100  1200  59
A        01/01/2019...  -30      91     200  1300  1400  91
A        01/01/2019...  -30      93     250  1550  1600  93
A        01/01/2019...  -30      95       0  1550  1800  93
A        01/01/2019...  -30      99     450  2000  2000  99")[, var5 := NULL]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...