Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在data.table中生成具有上限值的列_R_Data.table_Max_Min - Fatal编程技术网

R 在data.table中生成具有上限值的列

R 在data.table中生成具有上限值的列,r,data.table,max,min,R,Data.table,Max,Min,我有一个类似于以下的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 valu

我有一个类似于以下的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)
      }
它应该会回来

| 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  |
但是,它给出的是以下dt:

| 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更复杂,因此不可能简单地通过=“ID”]执行
dt[,CALC:=func(C1,C2,C3),因为它应该类似于
by=(GROUP1,GROUP2,ID)
,而且我确信它必须更简单。也许有一个简单的方法通过函数本身


非常感谢您的时间。

您需要使用
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

func-mayby
by=seq_len(dt[,.N])
?它适用于我正在使用的简化模型,但我可以看到,对于这样几行(100行,而实际的一行大约是1000万行)它是如何花费大量时间的。还有其他可能性吗?请查看Onyanbu的矢量化
func
非常感谢!这就是我一直在寻找的答案。
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