R 在data.table中生成具有上限值的列
我有一个类似于以下的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
| 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-maybyby=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