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