首页 > 解决方案 > 在 ifelse 语句中使用来自 dplyr 的 ntile

问题描述

我正在尝试使用 ntile(来自 dplyr)将一些数据分割成“n”个相等的桶,分别用于同一 data.table 列中的负值和正值。

我将通过一个简单的例子来说明我的意思:

require(data.table)
require(dplyr)
Buckets <- 3

Check <- data.table(a = sample(-30:30,30))
Check[a < 0,Test := ntile(a[a < 0],Buckets) * -1]
Check[a >= 0,Test := ntile(a[a >= 0],Buckets)]

当我执行测试以查看存储桶是否正常(即不重叠)时,您可以看到它已签出:

Check[,range(a),by = Test][order(Test)]

我想将上述内容合并到 data.table “Check”中的一个 ifelse 语句中,因为在实践中,我将在多个列上执行这些计算,并且大于或小于 0 的行将因列而异。因此,我更愿意只对列进行操作,而不是按照原始代码分别按行进行子集化并为每一列重复它。

当我尝试执行以下操作时,它似乎没有识别出我在调用“ntile”函数时所期望的行:

Check[,Test := ifelse(a < 0,
                 ntile(a[a < 0],Buckets)*-1,
                 ntile(a[a >= 0],Buckets))]

再次执行检查:

Check[,range(a),by = Test][order(Test)]

哪个不检查...

谁能让我知道我缺少什么以及是否可以在这里使用“ifelse”?也欢迎任何其他方法,因为我总是热衷于学习新事物。

任何帮助将不胜感激。谢谢

标签: rif-statementdplyrdata.table

解决方案


推荐阅读