[МУЗЫКА] [МУЗЫКА] Вы наверняка много работали с таблицами и знаете, что в них удобно хранить данные. Самое главное, их удобно туда вбивать в начале. Собственно, мы сейчас с вами разберем, как устроен самый распространенный табличный тип данных Этот тип данных называется dataframe и я бы сказала, что это полный аналог таблицы Exel или редактора Calc. В нем есть строки и столбцы. В идеале строка это одно наблюдение, а в столбцах записаны этих наблюдений, и столбцы dataframe мы будем называть переменными. Работу с dataframe-ами мы рассмотрим на примере небольшого кусочка данных о персонажах "Звездных войн". Мы его взяли с сайта SWAPI, это фанатский сайт, там написано буквально все, что может увлекающийся человек знать о персонажах "Звездный войн". Но мы взяли из всего этого обилия информации лишь небольшой кусочек. Маленький-маленький кусочек так, чтобы его можно было целиком просмотреть на одной странице слайда. Поэтому когда мы будем разбирать операции с dataframe-ами и нарезать их на кусочки различными способами вы легко сможете проконтролировать на этом фрагменте что именно вы делаете и приводит ли это к нужным результатам. Потому что вы будете способны распечатать на экран весь dataframe целиком. На самом деле это роскошь, которой большую часть времени аналитики лишены, потому что обычно данные выглядят гораздо больше и их нельзя просмотреть целиком. Или по крайней мере можно просомтреть, но найти в них что-либо глазом практически невозможно. Данный о персонажах "Звездный войн" хранятся tiny_starwards. Я надеюсь, вы его уже скачали с сайта и положили в директорию data внутри вашей папки с материалами курса. Чтобы открыть эти данные нам нудно использовать инструкрцию load. Она умеет открывать только данные во внутреннем формате R который называется R-data. Если вы выполните эту инструкцию и все прошло хорошо, то у вас в рабочем пространстве появится переменная SW заглавными буквами (от Star Wars). Вы можете смело распечатывать в консоли содержимое. Это dataframe, в котором девять строк и несколько переменных. Что у нас есть здесь за информация? У нас есть информация об именах персонажей, об их росте, весе, цвете волос. Пол известен, изветсна видовая принадлежности и кроме того количество фильмов, в которых они снимались. Давайте попробуем посмотреть, что находится внутри датафрейма. Если у вас dataframe большой, то распечатать его целиком в консоль будет не очень удобно. Поэтому для подглядывания создали такие функции, которые называются Head и Tail. Можете посмореть несколько первых строк при помощи функции Head или несколько последних строк при помощи функции Tail. Функция Head по умолчанию выдает шесть первых строк dataframe. Функция Tail шесть последних. Если вам нужно какое-то другое количество, то вы можете менять аргумент N, который есть и у той, и у другой функции и задать ровно то количество строк, которое хотите посмотреть. Для того, чтобы узнать, сколько в датафрейме строк, нам нужно использовать функцию nrow. n от английского number, row — строка. Если вы хотите узнать, сколько переменных, используйте функцию ncol. number of columns. Собственно, вам не нужно ничего не распечатывать целый датафрейм и считать вручную, вы можете использовать эти функции узнаете, что в нашей датафрейме SW девять строк и семь столбцов. Если вы вдруг забыли, как называются переменные, и их вам нужно где-то использовать, а вы не помните, как они пишутся, то тогда вам понадобится функция colnames. Она выводит ровно имена переменных в строчку. И вот семь имен переменных в нашем датафрейме. Если вы хотите в сжатом виде увидеть всю эту информацию, вам пригодится функция str от английского слова structure. Мы так и говорим, что мы хотим посмотреть на структуру датафрейма. Что эта функция возвращает? Она нам говорит, во-первых, что тот объект, который мы ей передали это датафрейм. В нем девять строк и семь переменных. Дальше она выдает список их имен, и каждая строчка начинается со знака доллар. Это нам как бы намекает на то, что при помощи знака доллар можно извлечь какую-нибудь переменную. Вообще это про объекты разных типов и выдачу str справедливо. Дальше после знака доллар следует название переменной, и затем ее тип (тех данных, которые в ней хранятся). Что бы вы могли посмотреть правильно или непраивльно открылись данные, вам показывают первые несколько значений. Количество значений, опять же, можно регулировать. Итак, мы узнаем, что в нашем датафрейеме есть текстовые переменные. Эта аббревиатура character означает. И есть переменные числовые. Некоторые из них закодированы как то есть целые числа. Тот вопрос, который нас интересует в первую очередь, когда мы сталкиваемся с новыми данными, это есть ли в них пропущенные значения. Если да, то как они расположены. И тут нам не помогут логические операторы для проверки, нам потребуется специализированная функция, название которой начинается на is. Is.na проверяет являются ли аргументы ее элементы пропущенными значениями. Если мы ей передаем двумерный объект, датафрейм, она нам тоже возвращает двумерный объект. В данном случае это матрица, и в этой матрице каждый элемент показывает есть ли там пропущенное значение. В некоторых местах стоит True, там где в исходных данных в соответствующих ячейках был na. Просматривать такую двумерную матрицу довольно нудное занятие, и зачем нам это делать вручную. Есть функции-помощники, которые нам посчитают количество пропущенных значений в столбцах или в строчках. Здесь мы тоже на самом деле будем внутренне использовать этот трюк с проведением типов. Функция is.na возвращает логические данные. Функция colSums умеет считать суммы по числам. Внутри аналогические данные превращают в числовые. Соответственно, там где стояло False там будет 0, там где стояло True будет 1. Функция colSums посчитает сумму по колонкам. Так мы узнаем, что про один из объектов не известен вес, и про некоторые объекты не известен цвет волос и пол. Такая сжатая информация нам не говорит, каким образом по строчкам были распределены эти пропущенные значения, то есть это необязательно один и тот же объект. Собственно, потом мы может использовать эту информацию о пропущенных значениях, чтобы их удалить. Или анализировать отдельно, или анализировать данные без пропущенных значений. Мы этим будем пользоваться.