создать столбец с ограниченными значениями в data.table - PullRequest
0 голосов
/ 03 июля 2018

У меня есть 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), и я уверен, что это должно быть проще. Может быть, есть простой способ пройти через саму функцию?

Большое спасибо за ваше время.

1 Ответ

0 голосов
/ 03 июля 2018

Вам нужно использовать pmin и pmax

func <- function(a, b, c){
  pol <- a*b-0.01*c
  pmin(pmax(pol, 0), 5)
}


transform(dat,s=func(C1,C2,C3))
  ID C1 C2  C3    s
1  1  1 20 400 5.00
2  2  0 15 500 0.00
3  3  0  2 350 0.00
4  4  1  4 402 0.00
5  5  1  8 333 4.67

 setDT(dat)[,CALC:=func(C1,C2,C3)]
 dat
   ID C1 C2  C3 CALC
1:  1  1 20 400 5.00
2:  2  0 15 500 0.00
3:  3  0  2 350 0.00
4:  4  1  4 402 0.00
5:  5  1  8 333 4.67
...