繁体   English   中英

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

[英]generate column with capped values in 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)
      }

我认为这将给我每一行的pol解,以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  |

但是,它提供的是以下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更复杂,因此不可能简单地执行dt[, CALC := func(C1, C2, C3), by="ID"] ,因为它应该类似于by=.(GROUP1, GROUP2, ID) ,而且我敢肯定它必须更简单。 也许有一个简单的方法可以遍历函数本身?

非常感谢您的宝贵时间。

您需要使用pminpmax

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM