На этой странице
- Быстрый старт
- Переменные
- Входные переменные
- Специальные переменные
- Пропущенные значения
- Значения и синтаксис
- Числа
- Строки
- Логические значения
- Массивы
- Индексирование
- Операторы
- Арифметические
- Операторы сравнения
- Логические операторы
- Условный оператор (тернарный)
- Математические функции
- Основные
- Агрегирующие
- Тригонометрические
- Дополнительные агрегирующие функции
- Строковые функции
- Регистр
- Проверка и поиск
- Извлечение
- Изменение
- Разбивка и объединение
- Сопоставление с шаблоном
- Форматирование
- Функции для работы с датами
- Практический пример: время до события для анализа выживаемости
- Многопеременные формулы
- Промежуточные переменные
- Редактор формул
- Советы
Справочник формул
Формулы в DataSuite 2 вычисляет библиотека Math.js, дополненная строковыми и служебными функциями. Здесь описано всё, что доступно в формулах, от простой арифметики до сложных выражений.
Быстрый старт
Пошаговые примеры подсчёта баллов по реальным опросникам приведены в руководстве по подсчёту баллов.
Формула вычисляется построчно: расчёт повторяется для каждого участника (строки данных) по его собственным значениям. Выбранные входные переменные обозначаются v1, v2, v3 и т. д.:
(v1 + v2) / 2
С агрегирующими функциями удобна запись диапазона v1:v7:
sum(v1:v7)
Для большинства задач этого достаточно. Ниже — полный справочник.
Переменные
Входные переменные
Переменные, выбранные на панели входных переменных, нумеруются в порядке выбора. Если выбрать, например, Возраст, Балл и Оценку, они станут v1, v2 и v3. Присвоенный номер показывает метка-ссылка рядом с именем переменной на той же панели.
| Обозначение | Значение |
|---|---|
v1, v2, v3, … |
значение 1-й, 2-й, 3-й … входной переменной в текущей строке |
c1, c2, c3, … |
весь столбец 1-й, 2-й, 3-й … входной переменной в виде массива (все строки) |
v1:v7 |
раскрывается во все переменные от v1 до v7, пишется внутри функций, например sum(v1:v7) |
Пустая ячейка — это пропуск, а не 0. Как пропуск обрабатывается в выражениях разного вида, описано в разделе Пропущенные значения.
Специальные переменные
| Переменная | Значение |
|---|---|
i |
номер текущей строки (с единицы) |
v |
текущее значение обрабатываемой переменной (см. ниже) |
c |
весь столбец обрабатываемой переменной в виде массива (см. ниже) |
v и c доступны, когда у правила несколько входных переменных, а результат записывается в режиме «Заменить исходные значения». Тогда формула выполняется для каждой переменной в каждой строке: v — значение текущей ячейки, c — весь её столбец. Так одно преобразование применяется сразу ко многим переменным: например, v * 100 переводит все выбранные переменные в проценты.
Пропущенные значения
Пустая ячейка попадает в формулу как пропуск и никогда не превращается в 0. Что будет дальше, зависит от того, где она стоит:
- Арифметика, сравнения и строковые функции — результатом для строки будет пропуск. При пустом
v2выражение(v1 + v2) / 2даёт пустое значение, как иv1 > 3 ? 1 : 0: сравнение с пропуском не даёт ни истины, ни лжи. - Агрегирующие функции по диапазону или столбцу — пустое значение не учитывается.
mean(v1:v7)с одним пустым пунктом даёт среднее остальных шести,sum(c1)складывает непустые ячейки столбца, аcount(v1:v7)считает пункты с ответом. Если пусты все значения, получается пропуск (countв этом случае даёт 0). Необязательный последний аргумент задаёт минимальное число заполненных значений:mean(v1:v7, 5)даёт пропуск, если ответов меньше пяти. (Исключение —quantileSeq: у этой функции второй аргумент задаёт вероятность.) ==— пропуск не равен ничему, поэтомуv1 == 0на пустой ячейке даётfalse. Проверяйте пропуск функциями из таблицы ниже или сравнением сnull:v1 == null.
Чтобы обработать пропуск отдельно или подставить вместо него значение, используйте эти функции:
| Функция | Описание | Пример |
|---|---|---|
isBlank(x) / isMissing(x) |
true для пустой ячейки, пустой строки и строки из одних пробелов | isBlank(v1) ? 0 : v1 * 2 |
isNotBlank(x) |
обратная проверка | isNotBlank(v1) ? v1 : 0 |
coalesce(a, b) |
a, если значение есть, иначе b |
coalesce(v1, 0) |
Суммарные баллы и пропущенные пункты:
sum(v1:v9)не учитывает пустой пункт, так что респондент, не ответивший на один вопрос, получает сумму остальных восьми, то есть заниженный итог, а не пропуск. Если сумма нужна только при ответах на все пункты, задайте минимум:sum(v1:v9, 9). Другой путь — пересчитать сумму пропорционально: возьмите среднее по пунктам с ответом и умножьте его на число пунктов шкалы. Формулаmean(v1:v9, 7) * 9даёт пропуск, если ответов меньше семи, а иначе — сумму, которую при таком среднем дала бы полностью заполненная шкала.
Значения и синтаксис
Числа
Числа записываются как есть: 42, 3.14, -7. Поддерживается экспоненциальная запись: 1.5e3 (= 1500).
Строки
Строки заключаются в двойные кавычки: "привет". Оператор + соединяет строки: "ID_" + v1.
Логические значения
true и false возвращают сравнения и логические операторы, на них же опираются условные выражения.
Массивы
Массив записывается в квадратных скобках:
[1, 2, 3]
[v1, v2, v3]
["низкий", "средний", "высокий"]
Массивы нужны потому, что некоторые функции работают именно с ними. Например, min и max принимают как отдельные аргументы, так и массив:
min(v1, v2, v3)
min([v1, v2, v3])
Обе записи дают одинаковый результат.
Диапазон v1:v7 автоматически раскрывается в массив: запись sum(v1:v7) превращается в sum([v1, v2, v3, v4, v5, v6, v7]).
Индексирование
К отдельному элементу массива обращаются по индексу в квадратных скобках. Индексы начинаются с 1, а не с 0, как в большинстве языков программирования:
c1[1] // первое значение столбца 1
c1[i] // значение столбца 1 в текущей строке
Операторы
Арифметические
| Оператор | Значение | Пример |
|---|---|---|
+ |
сложение (или соединение строк) | v1 + v2 |
- |
вычитание | v1 - 10 |
* |
умножение | v1 * 100 |
/ |
деление | v1 / v2 |
% |
остаток от деления | v1 % 2 |
^ |
возведение в степень | v1 ^ 2 |
Оператор + соединяет и строки: "ID_" + v1 даёт "ID_42".
Операторы сравнения
| Оператор | Значение |
|---|---|
== |
равно |
!= |
не равно |
< |
меньше |
> |
больше |
<= |
меньше или равно |
>= |
больше или равно |
Результат сравнения — true или false. Сравнивать можно и числа, и строки.
Логические операторы
| Оператор | Значение | Пример |
|---|---|---|
and |
логическое И | v1 > 0 and v2 > 0 |
or |
логическое ИЛИ | v1 == 0 or v2 == 0 |
not |
логическое НЕ | not (v1 == 0) |
Условный оператор (тернарный)
condition ? valueIfTrue : valueIfFalse
Например, так метка назначается в зависимости от балла:
v1 >= 70 ? "зачёт" : "незачёт"
Для нескольких условий операторы вкладываются друг в друга:
v1 >= 90 ? "A" : (v1 >= 70 ? "B" : "C")
Математические функции
Ниже перечислены самые употребительные встроенные функции Math.js. Полный список приведён в документации Math.js.
Основные
| Функция | Описание | Пример |
|---|---|---|
abs(x) |
модуль (абсолютное значение) | abs(v1 - v2) |
round(x) |
округление до ближайшего целого | round(v1) |
round(x, n) |
округление до n знаков после запятой |
round(v1, 2) |
ceil(x) |
округление вверх | ceil(v1) |
floor(x) |
округление вниз | floor(v1) |
sign(x) |
-1, 0 или 1 | sign(v1) |
sqrt(x) |
квадратный корень | sqrt(v1) |
cbrt(x) |
кубический корень | cbrt(v1) |
pow(x, n) |
степень (то же, что x ^ n) |
pow(v1, 3) |
exp(x) |
e в степени x | exp(v1) |
log(x) |
натуральный логарифм | log(v1) |
log10(x) |
десятичный логарифм | log10(v1) |
log2(x) |
двоичный логарифм | log2(v1) |
Агрегирующие
Эти функции принимают несколько значений или массив (например, диапазон v1:v7). При расчёте по диапазону или столбцу пустые ячейки пропускаются, а необязательный последний аргумент задаёт минимальное число заполненных значений (см. Пропущенные значения):
| Функция | Описание | Пример |
|---|---|---|
sum(...) |
сумма значений | sum(v1:v5) |
mean(...) |
среднее арифметическое | mean(v1:v5) |
median(...) |
медиана | median(v1:v5) |
min(...) |
минимум | min(v1, v2, v3) |
max(...) |
максимум | max(v1:v5) |
std(...) |
стандартное отклонение | std(v1:v5) |
variance(...) |
дисперсия | variance(v1:v5) |
prod(...) |
произведение значений | prod(v1:v3) |
mode(...) |
самое частое значение (или несколько) в виде массива | mode(c1) |
mad(...) |
медианное абсолютное отклонение | mad(c1) |
quantileSeq(array, p) |
квантиль уровня p (от 0 до 1) или массив квантилей для массива уровней |
quantileSeq(c1, 0.75) |
count(...) |
число непустых значений | count(v1:v9) |
Тригонометрические
sin(x), cos(x), tan(x), asin(x), acos(x), atan(x) — все в радианах.
Дополнительные агрегирующие функции
| Функция | Описание | Пример |
|---|---|---|
countif(array, value) |
число элементов array, равных value |
countif(c1, "да") |
sumR(array, k) |
сумма (k - x) по всем x из array |
sumR(c1, 100) |
coalesce(a, b) |
a, если значение есть, иначе b |
coalesce(v1, 0) |
Строковые функции
Строковые функции работают с текстом. Большинство из них принимает строку первым аргументом.
Многие из них допускают и точечную запись, то есть вызов функции как метода значения. Обе формы равнозначны:
contains(v1, "тест") // обычная запись
v1.contains("тест") // точечная запись — тот же результат
Выбирайте ту, что удобнее. Точечная запись особенно удобна для цепочек вызовов: v1.trim().toLowerCase().
Регистр
| Функция | Описание | Пример |
|---|---|---|
toLowerCase(s) |
привести к нижнему регистру | toLowerCase(v1) |
toUpperCase(s) |
привести к верхнему регистру | toUpperCase(v1) |
capitalize(s) |
сделать первый символ заглавным | capitalize(v1) |
Проверка и поиск
| Функция | Описание | Возвращает |
|---|---|---|
length(s) |
число символов | число |
isBlank(x) |
true для пустой строки, строки из одних пробелов и пустой ячейки | логическое значение |
isNotBlank(x) |
true, если есть хотя бы один непробельный символ | логическое значение |
isString(x) |
true, если значение — строка | логическое значение |
contains(s, search) |
true, если s содержит search (includes(s, search) — та же функция) |
логическое значение |
startsWith(s, prefix) |
true, если s начинается с prefix |
логическое значение |
endsWith(s, suffix) |
true, если s оканчивается на suffix |
логическое значение |
indexOf(s, search) |
позиция первого вхождения (-1, если его нет) | число |
lastIndexOf(s, search) |
позиция последнего вхождения (-1, если его нет) | число |
Извлечение
| Функция | Описание | Пример |
|---|---|---|
substring(s, start) |
от start до конца строки |
substring(v1, 3) |
substring(s, start, end) |
от start до end, не включая end |
substring(v1, 0, 5) |
slice(s, start) |
как substring, но принимает отрицательные индексы |
slice(v1, -3) |
slice(s, start, end) |
фрагмент строки, индексы могут быть отрицательными | slice(v1, 1, -1) |
charAt(s, index) |
символ в позиции index |
charAt(v1, 0) |
left(s, n) |
первые n символов |
left(v1, 3) |
right(s, n) |
последние n символов |
right(v1, 4) |
Изменение
| Функция | Описание | Пример |
|---|---|---|
trim(s) |
убрать пробелы с обоих концов | trim(v1) |
trimStart(s) |
убрать пробелы в начале | trimStart(v1) |
trimEnd(s) |
убрать пробелы в конце | trimEnd(v1) |
replace(s, search, repl) |
заменить первое вхождение | replace(v1, "старое", "новое") |
replace(s, pattern, repl, flags) |
замена по регулярному выражению | replace(v1, "\\d+", "N", "g") |
replaceAll(s, search, repl) |
заменить все вхождения | replaceAll(v1, " ", "_") |
reverse(s) |
переставить символы в обратном порядке | reverse(v1) |
repeat(s, n) |
повторить n раз |
repeat("*", v2) |
padStart(s, len, pad) |
дополнить слева до длины len |
padStart(v1, 5, "0") |
padEnd(s, len, pad) |
дополнить справа до длины len |
padEnd(v1, 10, ".") |
Разбивка и объединение
| Функция | Описание | Пример |
|---|---|---|
split(s, separator) |
разбить строку на массив по разделителю | split(v1, ",") |
join(array, separator) |
соединить массив в строку | join(split(v1, ","), ";") |
Сопоставление с шаблоном
| Функция | Описание | Пример |
|---|---|---|
test(s, pattern) |
true, если регулярное выражение находит совпадение | test(v1, "^[A-Z]") |
match(s, pattern) |
найденное совпадение (или null) | match(v1, "\\d+") |
test(s, pattern, flags) |
то же с флагами регулярного выражения | test(v1, "привет", "i") |
match(s, pattern, flags) |
то же с флагами: с "g" — массив всех совпадений, а не только первого |
match(v1, "\\d+", "g") |
Форматирование
format(template, arg0, arg1, ...)
Подставляет на место {0}, {1} и т. д. соответствующие аргументы, не более пяти (от {0} до {4}):
format("Испытуемый {0}, группа {1}", v1, v2)
Функции для работы с датами
Даты в DataSuite 2 хранятся как текст в формате ISO 8601 (YYYY-MM-DD, например "2024-01-15"). Функции ниже разбирают такие строки и вычисляют разности с учётом календаря. Некорректная дата даёт NaN, а любая арифметика с NaN снова даёт NaN, поэтому ошибочная строка будет видна в результатах, а не исказит расчёт незаметно.
| Функция | Описание | Возвращает |
|---|---|---|
today() |
текущая дата в виде ISO-строки | строка (например, "2026-04-24") |
dateDiff(d1, d2, unit) |
разность двух дат с учётом календаря | число |
dateAdd(d, n, unit) |
сдвиг даты на n единиц, при отрицательном n — назад |
строка (ISO-дата) или "" при некорректном вводе |
Допустимые значения unit для dateDiff и dateAdd:
"day"— точное целое число дней."week"— дляdateDiffровноdays / 7, дляdateAddсдвиг наn × 7дней."month"— дляdateDiffчисло полных календарных месяцев плюс остаток в долях текущего месяца с учётом его фактической длины (28, 29, 30 или 31 день). ВdateAddчислоnокругляется до целых месяцев, а если в итоговом месяце нет такого числа, берётся его последний день (Jan 31 + 1 month → Feb 28/29)."year"— дляdateDiffчисло полных лет плюс остаток в долях года с учётом его фактической длины (365 или 366 дней). ВdateAddчислоnокругляется до целых лет, а 29 февраля високосного года при сдвиге на невисокосный год становится 28 февраля.
Календарные месяцы вместо средней длины месяца:
dateDiff(d1, d2, "month")не делит на среднюю длину месяца (например, 30.4375 дня). Функция считает полные календарные месяцы, а оставшиеся дни берёт как долю того месяца, на который они приходятся, поэтому между одними и теми же числами разных месяцев или лет всегда получается целое число:dateDiff("2024-01-15", "2025-01-15", "year")равно ровно1.0. По той же логике 29 февраля в невисокосном году приравнивается к 28 февраля.
Примеры:
dateDiff("2024-01-15", "2024-02-15", "month") // 1.0 — ровно один календарный месяц
dateDiff("2024-01-15", "2024-03-01", "month") // ~1.517 — 1 месяц и 15 дней 29-дневного февраля
dateDiff("2020-02-29", "2021-02-28", "year") // 1.0 — 29 февраля приравнивается к 28 февраля
dateDiff("2024-01-15", today(), "day") // дней с включения в исследование по сегодня
dateAdd("2024-01-15", 60, "month") // "2029-01-15" — граница наблюдения через 5 лет
dateAdd("2024-01-31", 1, "month") // "2024-02-29" — ограничено концом месяца
dateAdd("2024-03-01", -30, "day") // "2024-01-31" — отрицательное n вычитает
Практический пример: время до события для анализа выживаемости
В данных для анализа выживаемости обычно есть дата включения и дата события, пустая у цензурированных участников (тех, кто всё ещё под наблюдением). Три правила преобразования превращают их в столбцы, которые нужны модулю анализа времени до события:
cutoff = isBlank(event_date) ? today() : event_date
follow_up = dateDiff(consent_date, cutoff, "month")
event_occurred = isNotBlank(event_date)
Первое правило берёт дату события, если она есть, а иначе считает, что участник наблюдается по сегодняшний день. Второе вычисляет срок наблюдения в месяцах от включения до этой даты. Третье создаёт бинарный индикатор события: в модуле анализа значения false и true автоматически получают роли «Цензурировано» и «Событие».
Чтобы считать в днях или годах, замените третий аргумент: dateDiff(consent_date, cutoff, "day") или ... "year". Если в данных есть отдельная дата последнего контакта для участников, живых к концу наблюдения, подставьте её вместо today():
cutoff = isBlank(event_date) ? last_contact_date : event_date
Если наблюдение в исследовании ограничено фиксированным административным сроком (например, пятью годами после включения), вычислите дату его окончания с помощью dateAdd:
admin_cutoff = dateAdd(consent_date, 60, "month")
cutoff = isBlank(event_date) ? admin_cutoff : event_date
Многопеременные формулы
Запись @Name = expression создаёт в одном правиле несколько выходных переменных:
@Total = v1 + v2 + v3
@Average = @Total / 3
@Centered = @Total - (mean(c1) + mean(c2) + mean(c3))
Объявление @Name создаёт новую переменную или перезаписывает существующую с тем же именем. В следующих объявлениях можно ссылаться на предыдущие через префикс @. Панель параметров вывода для многопеременных формул отключена: выходные переменные в них заданы явно.
Массив столбца есть у каждой входной переменной (mean(c1) — среднее первого пункта), а у объявленной переменной его нет. Поэтому центрируйте итог относительно суммы средних по пунктам, как в примере выше, а не относительно mean(c1 + c2 + c3): при поэлементном сложении столбцов первая же пустая ячейка в любом из них даёт ошибку.
Промежуточные переменные
Формула может занимать несколько строк. Разбейте сложный расчёт на понятные шаги с помощью присваиваний:
total = v1 + v2 + v3
total / 3
Результатом становится последняя строка, и именно она записывается в данные. Предыдущие строки задают промежуточные переменные для следующих выражений. Это то же самое, что (v1 + v2 + v3) / 3, но сложную формулу так легче читать.
Примечание: промежуточные присваивания (через
=) — это не то же самое, что многопеременные формулы (через@Name =). Промежуточные переменные существуют только внутри формулы и в набор данных не сохраняются.
Редактор формул
Возможности редактора формул:
- Подсветка синтаксиса — числа, строки, операторы и вызовы функций выделены цветом
- Подсветка парных скобок — когда курсор стоит рядом со скобкой, подсвечивается её пара
- Автодополнение — после двух введённых символов появляется список подсказок с переменными, функциями и константами. Чтобы открыть список вручную, нажмите Ctrl+Space. Рядом со ссылкой на переменную в списке показано её имя (например,
v1 Age) - Проверка ошибок — синтаксическая ошибка подчёркивается прямо при вводе, а её описание выводится на полях редактора
- Поиск — Ctrl+F ищет текст, Ctrl+H открывает поиск с заменой
Советы
- Пустая ячейка — не
0. Арифметика с пропуском даёт пропуск, а агрегирующие функции его не учитывают (см. Пропущенные значения). Заполнить пропуск можно так:coalesce(v1, 0). v1иc1—v1даёт одно значение (текущей строки), аc1— весь столбец в виде массива. Для расчётов по столбцу нуженc1:v1 - mean(c1)центрирует значения относительно среднего по столбцу.- Ошибка в формуле даёт пропуск в этой строке, остальные данные она не затрагивает. Неожиданные пустые значения ищите в предпросмотре данных.
- Соединение строк выполняется оператором
+:v1 + " " + v2соединяет два текстовых значения через пробел. - Скобки задают порядок вычислений как обычно:
(v1 + v2) * v3. - Константы
pi,e,InfinityиNaNдоступны в формулах. - Комментарий начинается с
#:v1 + v2 # total score. Всё, что стоит после#до конца строки, игнорируется.