Часто возникает задача отфильтровать какое-то подмножество данных для анализа и для этого используются логические данные. С ними работают при помощи логических операторов и операторов сравнение. Именно это мы сейчас и разберем. Для обозначения логических данных в R используются два ключевых слова - TRUE-истина и FALSE. Они записанные большими буквами. Для ленивых есть два сокращения - буквы t и f. Но я не рекомендую вам их использовать, хоть это и гораздо быстрее писать, потому что эти сокращения не так хорошо заметны в коде и их легко пропустить, и код хуже читается. Логические операторы могут показаться вам с первого взгляда странными. Оператор сравнения в R выглядит как два знака равенства, оператор, который проверяет неравенство, выглядит как "!=". Восклицательный знак символизирует отрицание, и эти два оператора умеют работать с любыми типами данных. Вы можете им скормить часовые типы, можете им дать текст, они проверят равенство. А вот операторы, которые проверяют неравенство, или отношения больше или меньше, они не могут работать с текстовыми данными, потому что для них эти отношения не определены. Вам нужны числовые данные давать этим операторам. Ещё логические данные получаются в результате работы функций, которые проверяют тип данных. Их названия все единообразно начинаются на is, например, is Numeric проверит, является ли ее аргумент числом, is.na проверит, является ли ее аргумент пропущенным значением. Об этих функциях вы можете почитать в справке. Еще есть интересный логический оператор, который называется оператор сопоставления и записывается довольно странно, % in %, и он проверяет, является ли его аргумент чем-то из перечня, который вы ему даете. Давайте попробуем посмотреть как это работает на числовах векторах. Вектор sugar мы с вами создали в прошлом видео и там записано сколько кусочков сахара лежит в чашках с чаям. Если мы попросим R сказать нам, в каких чашках ровно два куска сахара, нам нужно написать sugar == 2, и тогда мы получим логический вектор в котором true будет стоять только там, где в исходном векторе sugar стояло 2. А если мы захотим узнать, в каких чашках очень сладкий чай, больше двух кусков сахара, мы должны написать sugar > 2, и в результате мы тоже получим логический вектор. Логические векторы можно сохранять в виде переменных. Переменную со сладким чаем мы можем назвать sweet. Если мы захотим узнать, в каких чашках нет сахара, или он слишком сладкий, нам, вообще-то, есть несколько вариантов действий, но мы можем использовать оператор сопоставления, чтобы вы посмотрели как он работает. Если мы напишем sugar in и в векторе перечислим тот набор значений, которые мы хотим проверить, то получится логический вектор, в котором true стоит только если в чашках нет сахара или больше двух кусков. Для текстовых векторов эти операторы работают практически аналогично. У нас уже был создан вектор strength, в котором было записано насколько крепким является чай, там было написано так себе, средний, крепкий, и в последней чашке был чай средней крепости, и мы можем спросить, в каких чашка крепкий чай? Для этого, для проверки этого условия нам нужно использовать оператор равенства. Мы пишем strength == "крепкий". Крепкий, естественно, значение должно окружать кавычками, чтобы показать R, что это текстовые данные. В результате мы получим логический вектор. Точно так же мы можем проверить, в каких чашках чай не является крепким. Мы тогда используем оператор неравенства, и оператор сопоставления in умеет работать с текстовыми данными точно также, он может из любого перечня проверить значение. Например, мы можем хотеть узнать в каких чашках чай будет крепкий или средний, потому что мы не хотим некрепкий чай пить, и этот оператор нам поможет получить логический вектор, где true стоит ровно там, где мы хотим. Если вы вдруг хотите проверить несколько условий, то результаты их проверки при помощи операторов сравнения можно объединить с помощью логических операторов. В R их есть несколько, собственно, это обычные логические операторы, логическое "и", после его работы истина получается только если оба его операнда истина. Логическое "или" выдает истину в двух случаях, если один из операндов истина, и есть оператор отрицания, который выглядит не очень заметно, это восклицательный знак, если его поставить перед чем-то из логических значений, то они все превратятся в свою полную противоположность, true станет false и false станет true. Давайте посмотрим как можно проверить несколько условий сразу. Если вы хотите узнать в каких чашках одновременно не крепкий чай и сладкий, то вы можете решить эту задачу в два действия. Во-первых, конечно можно проверить условия, является ли чай не крепким при помощи оператора не равно. И записать результат проверки в вектор mild, не крепкий чай. Второе действие, это проверить, является ли чай сладким, и результат проверки мы запишем в вектор sweet. А теперь нам нужен логический оператор, потому что нам нужно, чтобы одновременно выполнялись эти два условия, т.е. нам нужно, чтобы одновременно в векторе mild и в векторе sweet стояла true, и мы пишем mild & sweet, и получаем true только в четвертой позиции. В этой чашке чай одновременно не является крепким и в нем много сахара. То же самое можно сделать в одно действие. На самом деле мы можем записать оба условия одновременно и объединить их при помощи логического оператора. Это может быть не очень хороший стиль, потому что такие длинные строчки очень сложно читаются. Если вы не уверены в том, что вы сможете потом вспомнить о чем шла речь, лучше расставьте скобки. Кроме того, если вы растаете скобки, то результат будет гораздо легче предсказать, потому что если вы одновременно используете несколько логических операторов, они тоже выполняются немножко в разном порядке, чтобы прогнозировать скобки ставить надежнее. А теперь, давайте я покажу вам небольшой трюк с проведением типов. Приведение типов не путайте с призраками. Это значит всего лишь, что один тип данных умеет превращаться в другой, и в R логические данные умеют превращаться в числовые. Собственно мы можем это сделать принудительно, при помощи функции as.numeric. Если ей мы передадим логический вектор, то он превратится в числовой, и везде, где стояла true, будет стоять единица, а везде, где стояла false, будет стоять ноль. Зачем это нужно? На самом деле это нужно для некоторых программистских трюков. Например, мы можем, используя эти свойства, узнать сколько раз в нашем логическом векторе, который получился из за проверки условия, получилось true. Чтобы посчитать количество значений true, нам всего лишь нужно посчитать сумму по логическому вектору. Обратите внимание, нам не нужно в данном случае использовать функцию as.numeric. R сам поймет, что мы передали функции sum логический вектор и этот логический вектор нужно превратить в числовой. В результате мы сразу знаем, что получилось три раза true в нашем векторе с некрепким чаем. Второй логический трюк, это подсчет доли значений true в логическом векторе. Это можно сделать при помощи функции mean. Если мы посчитаем среднее значение по логическому вектору, то нам придется, во-первых, просуммировать количество true, во-вторых, поделить на общую длину вектора. Это и есть среднее значение. Собственно эти два трюка мы с вами часто будем использовать на этапе разведочного анализа, когда нам нужно узнать как устроены данные внутри, чтобы не просматривать данные целиком, мы будем использовать некоторый набор проверок и логические операторы, и вот эти два трюка нам очень помогут.