在ifelse语句中使用dplyr中的ntile

时间:2019-01-11 11:23:24

标签: r if-statement dplyr data.table

我正在尝试使用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”?也欢迎任何其他方法,因为我一直热衷于学习新事物。

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

0 个答案:

没有答案