У меня есть data.table, похожая на следующую:
| ID | C1 | C2 | C3 |
| 1 | 1 | 20 | 400 |
| 2 | 0 | 15 | 500 |
| 3 | 0 | 2 | 350 |
| 4 | 1 | 4 | 402 |
| 5 | 1 | 8 | 333 |
И я хочу сгенерировать новый столбец «CALC», применяя такую функцию:
func <- function(a, b, c){
pol <- a*b-0.01*c
value <- min(max(pol, 0), 5)
}
Я думал, что это даст мне решение для каждой строки, ограниченное 0 и 5. Таким образом, вместо
| ID | C1 | C2 | C3 | CALC |
| 1 | 1 | 20 | 400 | 16 |
| 2 | 0 | 15 | 500 | -5 |
| 3 | 0 | 2 | 350 | -3.5 |
| 4 | 1 | 4 | 402 | -0.02 |
| 5 | 1 | 8 | 333 | 4.67 |
должно вернуть
| ID | C1 | C2 | C3 | CALC |
| 1 | 1 | 20 | 400 | 5 |
| 2 | 0 | 15 | 500 | 0 |
| 3 | 0 | 2 | 350 | 0 |
| 4 | 1 | 4 | 402 | 0 |
| 5 | 1 | 8 | 333 | 4.67 |
Но вместо этого он дает следующее:
| ID | C1 | C2 | C3 | CALC |
| 1 | 1 | 20 | 400 | 5 |
| 2 | 0 | 15 | 500 | 5 |
| 3 | 0 | 2 | 350 | 5 |
| 4 | 1 | 4 | 402 | 5 |
| 5 | 1 | 8 | 333 | 5 |
Так что, если я не ошибаюсь, он получает максимум значений в столбце (ограничивая его на 5) и вставляя вдоль столбца. Не то, что я намеревался, что было бы получить максимум каждого ряда в отдельности.
Есть ли какой-нибудь "легкий" способ исправить это? Исходный dt более сложный, поэтому было бы невозможно просто сделать dt[, CALC := func(C1, C2, C3), by="ID"]
, так как это должно быть что-то вроде by=.(GROUP1, GROUP2, ID)
, и я уверен, что это должно быть проще. Может быть, есть простой способ пройти через саму функцию?
Большое спасибо за ваше время.