Возвращает минимальное значение для подгрупп сгруппированных данных - PullRequest
0 голосов
/ 19 февраля 2019

Строки сгруппированы по переменным grp1, grp2, grp3 .Для каждого значения varD в таблице ниже мне нужно вернуть минимальное значение varA из минимума всех значений VarC , которые> = VARD ?Возвращенное значение сохраняется в столбце varX

В данной строке конкретные varC и varD не являются парами.Скорее varD необходимо сравнивать со всеми varC при расчете минимального varC , превышающего varD .

varA , varB и varC являются парами, при этом varC представляет собой совокупную сумму varB.

grp1   grp2(POSIXct)        grp3  varA  varB  varC  varD  
A      02/02/2019 05:30:00  -30   -100  1661  1661   280
A      02/02/2019 05:30:00  -30      0     0  1661   560
A      02/02/2019 05:30:00  -30     57   720  2381   840
A      02/02/2019 05:30:00  -30     59     0  2381  1120
A      02/02/2019 05:30:00  -30     70     0  2381  1400
A      02/02/2019 05:30:00  -30     77     0  2381  1680
A      02/02/2019 05:30:00  -30     91    80  2461  1960
A      02/02/2019 05:30:00  -30     93     0  2461  2240
A      02/02/2019 05:30:00  -30     95     0  2461  2520
A      02/02/2019 05:30:00  -30     99   340  2801  2800

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

grp1   grp2(POSIXct)        grp3  varA  varB  varC  varD  varX
A      02/02/2019 05:30:00  -30   -100  1661  1661   280  -100
A      02/02/2019 05:30:00  -30      0     0  1661   560  -100
A      02/02/2019 05:30:00  -30     57   720  2381   840  -100  
A      02/02/2019 05:30:00  -30     59     0  2381  1120  -100
A      02/02/2019 05:30:00  -30     70     0  2381  1400  -100
A      02/02/2019 05:30:00  -30     77     0  2381  1680    57
A      02/02/2019 05:30:00  -30     91    80  2461  1960    57
A      02/02/2019 05:30:00  -30     93     0  2461  2240    57
A      02/02/2019 05:30:00  -30     95     0  2461  2520    99
A      02/02/2019 05:30:00  -30     99   340  2801  2800    99

Для varD:

  • 1661 - это мин varC > = 280 - 1400, поэтому varX равно -100 (мин varA , где varC == 1661)
  • 2381 равноmin varC > = 1680 - 2240, поэтому varX равно 57 (мин varA где varC == 2381)
  • 2801 - это мин varC > = 2520 - 2800, поэтому varX равно 99 (мин varA , где varC == 2801)

1 Ответ

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

Сначала вы можете найти минимальные значения по группам, а затем использовать скользящее соединение, чтобы найти ближайшие минимальные значения:

agg <- DT[, min(varA), by=.(grp1, grp2, grp3, varC)]

DT[, newvar :=
    agg[DT, on=c("grp1", "grp2", "grp3", varC="varD"), roll=-Inf]$V1
]

вывод:

    grp1                grp2 grp3 varA varB varC varD newvar
 1:    A 02/02/2019T05:30:00  -30 -100 1661 1661  280   -100
 2:    A 02/02/2019T05:30:00  -30    0    0 1661  560   -100
 3:    A 02/02/2019T05:30:00  -30   57  720 2381  840   -100
 4:    A 02/02/2019T05:30:00  -30   59    0 2381 1120   -100
 5:    A 02/02/2019T05:30:00  -30   70    0 2381 1400   -100
 6:    A 02/02/2019T05:30:00  -30   77    0 2381 1680     57
 7:    A 02/02/2019T05:30:00  -30   91   80 2461 1960     57
 8:    A 02/02/2019T05:30:00  -30   93    0 2461 2240     57
 9:    A 02/02/2019T05:30:00  -30   95    0 2461 2520     99
10:    A 02/02/2019T05:30:00  -30   99  340 2801 2800     99

данные:

library(data.table)
DT <- fread("grp1   grp2        grp3  varA  varB  varC  varD  
A      02/02/2019T05:30:00  -30   -100  1661  1661   280
A      02/02/2019T05:30:00  -30      0     0  1661   560
A      02/02/2019T05:30:00  -30     57   720  2381   840
A      02/02/2019T05:30:00  -30     59     0  2381  1120
A      02/02/2019T05:30:00  -30     70     0  2381  1400
A      02/02/2019T05:30:00  -30     77     0  2381  1680
A      02/02/2019T05:30:00  -30     91    80  2461  1960
A      02/02/2019T05:30:00  -30     93     0  2461  2240
A      02/02/2019T05:30:00  -30     95     0  2461  2520
A      02/02/2019T05:30:00  -30     99   340  2801  2800")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...