Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laba_3_Tipy_dannykh.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
134 Кб
Скачать
☆

3.6. Списки

Списки — ещё один очень важный тип представления данных. Создавать их, особенно на первых порах, скорее всего, не придётся, но знать их особенности необходимо. Это нужно, прежде всего потому, что очень многие функции в R возвращают именно списки. В начале знакомства создадим список для тренировки:

> l <- list("R", 1:3, TRUE, NA, list("r", 4))

> l

[[1]]

[1] "R"

[[2]]

[1] 1 2 3

[[3]]

[1] TRUE

[[4]]

[1] NA

[[5]]

[[5]][[1]]

[1] "r"

[[5]][[2]]

[1] 4

Видно, что список — это своего рода ассорти. Вектор и, соответственно, матрица могут состоять из элементов только одного и того же типа, а вот список — из чего угодно. В том числе, как это видно из примера, и из других списков. Теперь поговорим про индексирование, или выборе элементов списка. Элементы вектора выбираются, при помощи функции -квадратной скобки:

> h[3]

[1] 8.5

Элементы матрицы выбираются так же, только используется несколько аргументов (для двумерных матриц это номер строки и номер столбца — именно в такой последовательности):

> ma[2, 1]

[1] 3

А вот элементы списка выбираются тремя различными методами. Во первых можно использовать квадратные скобки:

> l[1]

[[1]] [1] "R"

> str(l[1])

List of 1

$ : chr "R"

Здесь очень важно, что полученный объект тоже будет списком. Во вторых можно использовать двойные квадратные скобки:

> l[[1]]

[1] "R"

> str(l[[1]])

chr "R"

В этом случае полученный объект будет того типа, какого он был бы до объединения в список (поэтому первый объект будет текстовым вектором, а пятый — списком). В третьих можно использовать имена элементов списка. Но для этого сначала надо их присвоить:

> names(l) <- c("first", "second", "third",

+ "fourth", "fifth")

> l$first

[1] "R"

> str(l$first)

chr "R"

Для выбора по имени используется знак доллара, а полученный объект будет таким же, как при использовании двойной квадратной скобки. На самом деле имена в R могут иметь и элементы вектора, и строки и столбцы матрицы:

> names(w) <- c("Коля", "Женя", "Петя", "Саша",

+ "Катя", "Вася", "Жора")

> w

Коля Женя Петя Саша Катя Вася Жора

69 68 93 87 59 82 72

> rownames(ma) <- c("a1","a2")

> colnames(ma) <- c("b1","b2")

> ma

b1 b2

a1 1 2

a2 3 4

Единственное условие состоит в том, что все имена должны быть разными. Однако, знак доллара ($) можно использовать только со списками. Элементы вектора по имени можно отбирать так:

> w["Женя"]

Женя

68

3.7. Таблицы данных

Наконец подошли к самому важному типу данных — к таблицам данных (data frames). Именно таблицы данных больше всего похожи на электронные таблицы Excel и аналогов, и поэтому с ними работают чаще всего. Особенно это касается начинающих пользователей R . Таблицы данных — это гибридный тип представления, одномерный список из векторов одинаковой длины. Таким образом, каждая таблица данных — это список колонок, причём внутри одной колонки все данные должны быть одного типа. Проиллюстрируем это на примере созданных в этой лабораторной работе векторов:

> d <- data.frame(weight=w, height=x, size=m.o, sex=sex.f)

> d

weight height size sex

Коля 69 174 L male

Женя 68 162 S female

Петя 93 188 XL male

Саша 87 192 XXL male

Катя 59 165 S female

Вася 82 168 M male

Жора 72 172 L male

> str(d)

’data.frame’: 7 obs. of 4 variables:

$ weight: num 69 68 93 87 59 82 72

$ height: num 174 162 188 192 165 168 172

$ size : Ord.factor w/ 5 levels "S"<"M"<"L"<"XL"<"XXL":

3 1 4 5 1 2 3

$ sex : Factor w/ 2 levels "female","male": 2 1 2 2 1 2 2

Поскольку таблица данных является списком, к ней применимы методы индексации списков. Кроме того, таблицы данных можно индексировать и как двумерные матрицы. Вот несколько примеров:

> d$weight

[1] 69 68 93 87 59 82 72

> d[[1]]

[1] 69 68 93 87 59 82 72

> d[,1]

[1] 69 68 93 87 59 82 72

> d[,"weight"]

[1] 69 68 93 87 59 82 72

Очень часто бывает нужно отобрать несколько конкретных колонок. Это можно сделать разными способами (исключаем столбец weight):

> d[,2:4]

Height size sex

Коля 174 L male

Женя 162 S female

Петя 188 XL male

Саша 192 XXL male

Катя 165 S female

Вася 168 M male

Жора 172 L male

> d[,-1]

height size sex

Коля 174 L male

Женя 162 S female

Петя 188 XL male

Саша 192 XXL male

Катя 165 S female

Вася 168 M male

Жора 172 L male

Второй способ (отрицательная индексация) бывает в некоторых случаях незаменим. К индексации имеет прямое отношение ещё один тип данных в R — логические векторы. Как, например, отобрать из нашей таблицы только данные, относящиеся к женщинам? Вот один из способов:

> d[d$sex=="female",]

Weight height size sex

Женя 68 162 S female

Катя 59 165 S female

Чтобы отобрать нужные строки, мы поместили перед запятой логическое выражение, d$sex==female. Его значением является логический вектор:

> d$sex=="female" [1] FALSE TRUE FALSE FALSE TRUE FALSE FALSE

Таким образом, после того, как «отработала» селекция, в таблице данных остались только те строки, которые соответствуют "TRUE то есть строки 2 и 5. Более сложным случаем селекции является сортировка таблиц данных. Для сортировки вектора достаточно применить команду sort(), а вот если нужно, скажем, отсортировать наши данные сначала по полу, а потом по росту, приходится применить операцию посложнее:

> d[order(d$sex, d$height), ]

weight height size sex

Женя 68 162 S female

Катя 59 165 S female

Вася 82 168 M male

Жора 72 172 L male

Коля 69 174 L male

Петя 93 188 XL male

Саша 87 192 XXL male

Команда order() создаёт не логический, а числовой вектор, который соответствует будущему порядку расположения строк. Подумайте, как применить команду order() для того чтобы отсортировать колонки по алфавиту.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]