Я пытаюсь сегментировать некоторые данные, используя 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)]
Я хочу объединить все вышеперечисленное в один оператор ifelse в data.table «Check», так как на практике я буду выполнять эти вычисления для нескольких столбцов, а строки, которые больше или меньше 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»? Любые другие подходы также приветствуются, так как я всегда стремлюсь изучать новые вещи.
Любая помощь будет принята с благодарностью.
Спасибо