[МУЗЫКА] [МУЗЫКА]
[МУЗЫКА] Еще
одной часто используемой структурой данных языка R являются данные типа data.frame.
Давайте поподробнее разберем работу с ними на конкретном примере.
Допустим, я хочу сформировать экзаменационную ведомость для десяти
учащихся по определенному предмету.
Сформирую компоненты этой ведомости.
То есть в ней у меня будут содержаться номера учащихся,
у меня будут их имена и фамилии, их пол.
Для начала сформируем номера учащихся,
то есть зададим обычный вектор значений от 1 до 10.
Далее сформируем столбец, который будет содержать имена учащихся.
Это будет объект names, содержащий 10 текстовых переменных.
Чтобы не лепить это все в одну строчку, я каждое значение буду набирать
с новой строки, при этом здесь команда будет ожидать от меня дальнейших действий,
но чтобы не делать это построчно, я выполню это сразу целым блоком.
Выделю все эти строки, нажимаем Ctrl + R, и, как видите, данная
команда выполнена полностью, до конца, и ждет программа дальнейших действий.
Посмотрим, как бы выглядел этот объект, если бы мы вывели его на экран.
То есть вот он, состоящий из 10 значений обычный текстовый вектор.
Длина этого вектора равна 10.
Допустим, мы решили добавить сюда пол.
Добавим пол.
Сформируем новый вектор gender и,
соответственно, 10 значений, соответствующих вот этим персонажам.
Мы определили пол и далее сформируем оценки,
мы сделаем это случайным образом, потому что у нас сейчас нет пока
какого-то конкретного примера с реальными данными, эти данные вымышленные.
Допустим, это будет случайная последовательность 10 значений
из набора от 3 до 5.
Посмотрим, какие у нас получились оценки в этом случае.
Оценки в целом неплохие, естественно, у нас есть несколько троек,
несколько четверок, несколько пятерок.
Оставим это в таком виде.
А вот теперь объединим все полученные объекты в новую единую
структуру типа data.frame.
То есть мы возьмем номер нашего учащегося, имя учащегося,
его пол и оценку из только что сформированного списка и посмотрим,
что представляет собой вновь созданный объект.
Как мы видим, у нас получилась таблица из 10 строк
и четырех столбцов, причем это таблица различных данных.
У нас есть порядковый номер, у нас есть текстовые переменные, у нас есть
числовые переменные, представляющие собой оценки в данном случае.
Допустим, я решила создать несколько
столбцов с оценками по различным предметам.
То есть я хочу сейчас к имеющимся данным немножко расширить таблицу
и добавить какие-то другие оценки.
Допустим, у меня будет еще три предмета, соответственно, 10 учащихся,
то есть мне нужно еще 30 оценок также из диапазона от 3 до 5.
Для этого я сформирую новый вектор grades2,
это будет матрица размера 10 на три, то есть 10 наблюдений по трем дисциплинам.
То есть в матрице всего будет 30 чисел из диапазона от трех до пяти.
Естественно, мне нужно, чтобы повторы были возможны,
поэтому мы используем тот же самый параметр истины.
Можно было опустить имя аргумента, можно было написать его полностью,
а можно, как в нашем случае, сократить до трех первых букв.
Все эти три варианта будут давать нам одинаковый результат.
Выполним эту операцию и посмотрим, что мы получили.
Сейчас мы имеем числовую матрицу, состоящую из трех столбцов,
оценок ну как бы условно по трем предметам.
И создадим новую таблицу, уже расширенную, состоящую из этих оценок,
а также предыдущей информации, то есть номеров, имен и пола.
В той же самой последовательности включаем их в нашу таблицу,
сначала номер, потом имя, пол и все оценки.
Собираем их вместе, выводим на экран и получаем вот такую табличку.
Если мы здесь будем использовать имя аргумента,
то в таблице подписи
столбцов у нас будут в соответствии с исходным именем.
То есть у нас будет сначала идти имя переменной grades, а потом по
порядку — номер столбца в матрице, то есть первый, второй и третий соответственно.
Ну, понятно, что это пока таблица сыроватая.
Для того, чтобы она стала еще больше у нас похожа на некоторую таблицу,
несущую какую-то реальную информацию, давайте подпишем реально,
что могли бы представлять собой эти данные.
Ну, первое — это понятно, номер.
Дальше — имя, дальше — пол, и поскольку у нас шли оценки как
бы по трем предметам, пусть это будет, например, математика, физика и история.
Соответственно, у нас сейчас в нашей таблице data.frame имеется раз, два,
три, четыре, пять, шесть столбцов, и мы должны задать им шесть имен.
Мы формируем вектор с помощью уже неоднократно
использованной операции c — объединение шести текстовых переменных.
При этом мы сразу же используем операцию colnames к нашему объекту data2,
тем самым имена столбцов должны быть переобозначены.
И вот она, наша новая табличка.
Как можно обращаться к элементам этой таблицы?
Так же, как мы работали с вами с матрицами и через квадратные скобки обращались,
соответственно, первым индексом — к номеру строки, а вторым индексом — к
номеру столбца, аналогичным образом мы можем поступать и здесь.
Если я возьму data, дальше в квадратных скобках опущу первый индекс и через
запятую укажу 2, это даст мне второй столбец соответствующей таблицы.
То есть это у нас сейчас фактор с вот такими вот уровнями.
Дальше, что представляет собой вторая строка?
Вторая строка будет соответствовать вот этим вот значениям,
то есть нашей учащейся Татьяне Ивановой.
Ctrl + R, вот мы и видим эти значения: порядковый номер 2,
дальше имя, пол и три оценки.
Если мы зададим оба индекса, то мы получим какой-то один конкретный элемент таблицы,
стоящий на пересечении соответствующей строки и соответствующего столбца.
Ctrl + R, то есть это у нас третья строка, пятый столбец,
это оценка Алексея Медведева по физике.
Так же, как мы это делали для списка list,
мы можем обращаться либо по номеру, либо через символ доллара,
вводя имя соответствующей переменной или, в данном случае, соответствующего столбца.
То есть мы можем вывести, например, только оценки по математике.
Ctrl + R, вот они, элементы четвертого столбца,
которые соответствуют названию «математика».
Мы можем вычислить среднее значение элементов данного столбца.
Как видим, средний балл в данном случае у нас получается 3,8.
Если я хочу сохранить оценки в отдельный объект,
соответственно, я должна задать имя этого объекта и присвоить
элементы второго столбца матрицы data.frame данному объекту.
Вот я присвоила,
и теперь я могу вычислить среднее значение для элементов нового объекта.
Естественно, мы получаем то же самое,
потому что именно эти значения у нас и были сохранены.
Далее.
Мы можем превратить нашу таблицу типа data.frame в матрицу, сменив тип данных.
То есть мы используем функцию as.matrix, Ctrl + R,
и смотрим, что за объект у нас при этом получился.
Обратите внимание на принципиальное отличие.
То есть когда мы с вами работали с объектом типа data.frame,
то есть вот здесь в исходной таблице она у нас содержала как текстовую, так и
числовую информацию, и соответственно, мы могли работать с ней, как с числовой.
А теперь, как вы видите, все значения стоят в кавычках.
Дело в том, что если наша матрица содержит текстовые значения,
то вся матрица у нас становится текстовой.
То есть вот эти вот элементы у нас теперь уже, как числа, не воспринимаются.
Посмотрим, к чему это привело.
Я точно так же выведу оценки,
которые соответствовали оценкам по математике,
и такое обращение теперь у меня оказалось недопустимым.
Для того, чтобы обратиться к элементам матрицы, я должна четко задать номер.
Давайте обратимся по номеру столбца.
Вот теперь я получаю информацию об оценках, но, как мы видим,
эти оценки по-прежнему стоят в кавычках, то есть воспринимаются языком,
как текстовая информация.
Давайте сохраним их в отдельный вектор и попробуем найти их среднее значение,
как мы уже дважды сделали это выше.
Сохраняем в новый вектор, это будут оценки по математике,
но вытащенные теперь из матрицы.
Применяем среднее, и как видим, предупреждение языка, которое говорит нам
о том, что данный аргумент не является числовым, то есть он текстовый.
И соответственно, для него не может быть вычислена характеристика среднего
значения, которая используется только для количественной информации.
Продолжим работу с данным типом на других примерах.
Очистим консоль и выполним следующие операции.
Для начала создадим матрицу размера четыре на шесть,
то есть четыре на шесть, у нас должно быть 24 элемента.
Повторы нам здесь не нужны,
мы сгенерируем ровно 24 элемента от 1 до 24 и выведем эту матрицу сразу на экран.
Вот у нас получилась эта матрица.
Обратите внимание, мы использовали ту же функцию sample,
чтобы у нас были не по порядку идущие значения,
а сгенерированные в случайной произвольной последовательности.
При этом мы их сгенерировали ровно 24 без повторов.
Соответственно, здесь они у нас ни разу не повторяются.
Мы видим стандартную матричную структуру: четыре строки,
шесть столбцов, они у нас пронумерованы стандартным для матрицы образом.
А вот теперь сохраним эту матрицу, как таблицу, таблицу типа data.frame.
Обратите внимание, как выглядит эта структура.
Значения у нас те же самые, но у нас иначе теперь индексируются строки и столбцы.
У нас идет обычный порядковый номер для строк.
Как правило, в статистическом анализе это будет соответствовать номеру наблюдения.
А столбцы соответствуют переменным V1, V2,
V3, которые были зарегистрированы для соответствующего объекта.
Выше у нас был создан объект m, также новый объект df,
сохраним его, но теперь уже в формате data.frame.
Посмотрим, как выглядит теперь этот объект.
[ЗВУК] У нас была матрица, как вы помните, размера два на три.
Вот как она у нас выглядит сейчас.
Она воспринимается сейчас, как таблица, и при этом у нас сохранены те имена,
которые мы для нее использовали, потому что имена были определены нами.
Возвращаясь к нашему объекту mat3,
посмотрим тип и класс соответствующего объекта.
То есть тип у нее числовой, а класс — матрица.
Аналогично для созданного объекта df тип — list,
список, а класс у нас получился data.frame.
[МУЗЫКА]
[МУЗЫКА]