我data.table dt在 R 中有一個這樣的:
ukey time orderType a edge h1 h2
1: 10600877 93003000 Buy 14.12 100 0.002 0.0002
2: 10600188 93003000 Buy 24.29 100 0.003 0.0003
3: 10600995 93003000 Buy 17.23 100 0.003 0.0003
4: 10600262 93003000 Sell 18.89 100 0.002 0.0004
5: 10600399 93003000 Sell 18.66 100 0.004 0.0002
6: 10603260 93003000 Sell 110.39 100 0.003 0.0002
7: 11000004 93003000 Sell 22.98 100 0.002 0.0003
...
我想獲得一個check由某些條件呼叫的新列。我的示例代碼如下所示:
for (i in 1:nrow(dt)) {
if (dt[i, a - 1.5 * h1 > 111]) {
dt[, check:= "A"]
break
}
else if (dt[i, a edge - 1.3 * h1- 0.3 * h2> 111]) {
dt[, check:= "B"]
break
}
else if (dt[i, a- 1.5 * h1> 80]) {
dt[, check:= "C"]
break
}
else {dt[, check:= "D"]}
}
但是,我的代碼效果不佳且效率低下。您能給我一些更好的解決方案嗎?非常感謝!
uj5u.com熱心網友回復:
您可以嘗試case_when在dplyr包裝中使用。
dt[, check := case_when((a - 1.5 * h1) > 111 ~ "A",
(a edge - 1.3 * h1- 0.3 * h2)> 111 ~ "B",
(a- 1.5 * h1) > 80 ~ "C",
TRUE ~ "D")]
結果看起來像:
> dt
ukey time orderType a edge h1 h2 check
1: 10600877 93003000 Buy 14.12 100 0.002 2e-04 B
2: 10600188 93003000 Buy 24.29 100 0.003 3e-04 B
3: 10600995 93003000 Buy 17.23 100 0.003 3e-04 B
4: 10600262 93003000 Sell 18.89 100 0.002 4e-04 B
5: 10600399 93003000 Sell 18.66 100 0.004 2e-04 B
6: 10603260 93003000 Sell 110.39 100 0.003 2e-04 B
7: 11000004 93003000 Sell 22.98 100 0.002 3e-04 B
希望它是有用的。
uj5u.com熱心網友回復:
您正在尋找的是更快的ifelse等價物
子集法
library(data.table)
setDT(dt)
# initialise
dt[, check := "D"]
# faster ifelse
dt[a- 1.5 * h1> 80, check := "C"
][a edge - 1.3 * h1- 0.3 * h2> 111, check := "B"
][a - 1.5 * h1 > 111, check := "A"
]
請注意,后一個子集條件優先。因此,順序是相反的,即 C、B、A。我們的條件未捕獲的任何內容都將保留初始值,即 D
與 dplyr 類似的帖子和性能提升
data.table 的 fcase
# courtesy to SO user @langtang
df[, check := fcase(a - 1.5 * h1 > 111, 'A'
, a edge - 1.3 * h1 - 0.3 * h2 > 111, 'B'
, a - 1.5 * h1 > 80, 'C'
, default = 'D'
)]
使用此方法注意較早的條件優先。因此,順序為 A、B、C。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/432502.html
上一篇:回圈多個列以根據條件生成新變數
下一篇:Excel重復次數增加1
