Таблицы и вектора

Таблица

Вектор

Основной тип данных

Индексация начинается с 1!!!

Таблица

Таблица из одной строки будет вектором?

Вектор - данные одного типа 🏠

x <- c(0.5, 1.2, 3.6) # точка - разделитель разрядов
typeof(x) # double or numeric
[1] "double"
x <- c(5, 2, 3)
typeof(x) # double
[1] "double"
x <- 1:5
typeof(x) # integer  
[1] "integer"
x <- c(T,F,F,T) 
typeof(x) # logical  
[1] "logical"
x <- c('a','b','c')
typeof(x) # character 
[1] "character"

Таблица

Где тут вектора?

Вектора 🏠

У каждого элемента вектора есть:

  • значение

  • индекс или порядковый номер

  • имя (может быть пустым)

Операции с векторами

x <- c(2, 7, 3, 1)
x + 4
[1]  6 11  7  5

Операции с векторами

x <- c(2, 7, 3, 1)
y <- c(3, 2, 5, 6)
x + y
[1] 5 9 8 7

Операции с векторами

x <- c(2, 7, 3, 1)
y <- c(3, 2)
x + y
[1] 5 9 6 3

Операции с векторами 🏠

x <- 1:5
x
[1] 1 2 3 4 5
x^2 
[1]  1  4  9 16 25
-x 
[1] -1 -2 -3 -4 -5

Операции с векторами 🏠

x <- 1:5 
x 
[1] 1 2 3 4 5
y <- 1:2 
y
[1] 1 2
x+y
Warning in x + y: длина большего объекта не является произведением длины
меньшего объекта
[1] 2 4 4 6 6

Операции с векторами

x <- 1:6 
x
[1] 1 2 3 4 5 6
x > 4
[1] FALSE FALSE FALSE FALSE  TRUE  TRUE
x >= 4
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
x != 4
[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
x == 4
[1] FALSE FALSE FALSE  TRUE FALSE FALSE

Получаем логический вектор той же длины!

Операции с векторами 🏠

replace(x, x == 2, 12) 
[1]  1 12  3  4  5  6
x[2] <- 100 # заменить второй элемент вектора на 100
x
[1]   1 100   3   4   5   6
x %in% c(1, 4) 
[1]  TRUE FALSE FALSE  TRUE FALSE FALSE
x = 4 
x
[1] 4

Срезы: по индексам

x <- c(5, 16, 8, 32, 56, 2) 
x 
[1]  5 16  8 32 56  2
x[1]  # взять 1ый элемент 
[1] 5
x[2:4] # взять с 2го по 4ый элементы 
[1] 16  8 32
x[c(2, 5)] # взять 2ой и 5ый элементы 
[1] 16 56
x[-1] # без первого элемента 
[1] 16  8 32 56  2

Срезы: по индексам

x > 10  
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE
x[x > 10] # отобрать элементы больше 10 
[1] 16 32 56
x[x >= 5 & x < 10] # отобрать элементы больше или равные 5 И меньше 10 
[1] 5 8
x[x >= 5 | x < 10] # отобрать элементы больше или равные 5 ИЛИ меньше 10 
[1]  5 16  8 32 56  2

Срезы: по именам 🏠

x <- c(5,16,8,32,56,2) 
names(x) <- paste('v', 1:length(x), sep = '')
x 
v1 v2 v3 v4 v5 v6 
 5 16  8 32 56  2 
x['v3']  # взять элемент вектора х с именем v3 
v3 
 8 
x[c('v1', 'v3')] 
v1 v3 
 5  8 
x[c(1, 3)] 
v1 v3 
 5  8 

Полезные функции 🏠

x <- 1:6
y <- rep(7, 4)
x
[1] 1 2 3 4 5 6
y
[1] 7 7 7 7
any(x == 5)
[1] TRUE
any(x == 12)
[1] FALSE
all(x == 3)
[1] FALSE
all(y == 7)
[1] TRUE

Работа с переменными

Работа с переменными

ls() # список переменных из глобального окружения
rm(a, b) # удалить переменные a и b

rm(list=ls()) # удалить все переменные из глобального окружения

Названия переменных

НЕ должны:

  • начинаться с цифр

  • содержать пробелы

  • содержать специальные символы (+, -, /, , *, ^, …)

  • состоять из разезервированных слов (if, else, repeat, while, function, for, in, next, break, TRUE, FALSE, NULL, Inf, NaN, NA, …)

Data Frame

Кадры данных или данные табличного вида

Data frame

Создание

a <- c(5,4,8)
b <- c('a','b','c')
h <- c(T,F,T) 
g <- c(1.5,2.5,3.7) 
df <- data.frame(a,b,h)
df
  a b     h
1 5 a  TRUE
2 4 b FALSE
3 8 c  TRUE



df <- data.frame(a = c(5,4,8),
                 b = c('a','b','c'),
                 h = c(T,F,T),
                 g = c(1.5,2.5,3.7))
df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7

Data frame

Структура

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
str(df)
'data.frame':   3 obs. of  4 variables:
 $ a: num  5 4 8
 $ b: chr  "a" "b" "c"
 $ h: logi  TRUE FALSE TRUE
 $ g: num  1.5 2.5 3.7
dim(df)
[1] 3 4

Data frame 🏠

Строки и столбцы

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
colnames(df)
[1] "a" "b" "h" "g"
rownames(df)
[1] "1" "2" "3"

Data frame 🏠

Наполнение

df
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7
head(df, 2)
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
tail(df, 3)
  a b     h   g
1 5 a  TRUE 1.5
2 4 b FALSE 2.5
3 8 c  TRUE 3.7

Встроенные наборы данных

data()


?swiss

swiss

head(swiss,4)
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
Moutier                  20.3
str(swiss)
'data.frame':   47 obs. of  6 variables:
 $ Fertility       : num  80.2 83.1 92.5 85.8 76.9 76.1 83.8 92.4 82.4 82.9 ...
 $ Agriculture     : num  17 45.1 39.7 36.5 43.5 35.3 70.2 67.8 53.3 45.2 ...
 $ Examination     : int  15 6 5 12 17 9 16 14 12 16 ...
 $ Education       : int  12 9 5 7 15 7 7 8 7 13 ...
 $ Catholic        : num  9.96 84.84 93.4 33.77 5.16 ...
 $ Infant.Mortality: num  22.2 22.2 20.2 20.3 20.6 26.6 23.6 24.9 21 24.4 ...

swiss

Обращение к столбцу

colnames(swiss)
[1] "Fertility"        "Agriculture"      "Examination"      "Education"       
[5] "Catholic"         "Infant.Mortality"
swiss$Education
 [1] 12  9  5  7 15  7  7  8  7 13  6 12  7 12  5  2  8 28 20  9 10  3 12  6  1
[26]  8  3 10 19  8  2  6  2  6  3  9  3 13 12 11 13 32  7  7 53 29 29
table(swiss$Education)

 1  2  3  5  6  7  8  9 10 11 12 13 15 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  5  3  1  1  1  1  2  1  1 

Data frame

Срезы

dim(swiss)
[1] 47  6
head(swiss,3)
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
swiss[3,6] 
[1] 20.2

Data frame 🏠

Срезы

swiss[8,]
      Fertility Agriculture Examination Education Catholic Infant.Mortality
Glane      92.4        67.8          14         8    97.16             24.9
swiss[1:3,]
             Fertility Agriculture Examination Education Catholic
Courtelary        80.2        17.0          15        12     9.96
Delemont          83.1        45.1           6         9    84.84
Franches-Mnt      92.5        39.7           5         5    93.40
             Infant.Mortality
Courtelary               22.2
Delemont                 22.2
Franches-Mnt             20.2
swiss['Courtelary',c('Examination','Education')]
           Examination Education
Courtelary          15        12

Data frame 🏠

Выбор данных по условию

table(swiss$Education)

 1  2  3  5  6  7  8  9 10 11 12 13 15 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  5  3  1  1  1  1  2  1  1 
vec <- c(12,15)
vec
[1] 12 15
mt <- swiss[swiss$Education %in% vec,]

Data frame 🏠

Выбор данных по условию

table(mt$Education)

12 15 
 5  1 
mt <- swiss[!(swiss$Education %in% vec),]
table(mt$Education)

 1  2  3  5  6  7  8  9 10 11 13 19 20 28 29 32 53 
 1  3  4  2  4  7  4  3  2  1  3  1  1  1  2  1  1 

which

swiss[1:3,1:3]
             Fertility Agriculture Examination
Courtelary        80.2        17.0          15
Delemont          83.1        45.1           6
Franches-Mnt      92.5        39.7           5
which(swiss$Examination == 6)
[1]  2 27
which(colnames(swiss) == 'Examination')
[1] 3
which.min(swiss$Examination)
[1] 31
which.max(swiss$Examination)
[1] 45

Data frame

Выбор данных по условию

swiss[swiss$Fertility > 40 & swiss$Education < 8,]
             Fertility Agriculture Examination Education Catholic
Franches-Mnt      92.5        39.7           5         5    93.40
Moutier           85.8        36.5          12         7    33.77
Porrentruy        76.1        35.3           9         7    90.57
Broye             83.8        70.2          16         7    92.85
Gruyere           82.4        53.3          12         7    97.67
Veveyse           87.1        64.5          14         6    98.61
Aubonne           66.9        67.5          14         7     2.27
Cossonay          61.7        69.3          22         5     2.82
Echallens         68.3        72.6          18         2    24.20
Moudon            65.0        55.1          14         3     4.52
Orbe              57.4        54.1          20         6     4.20
Oron              72.5        71.2          12         1     2.40
Paysd'enhaut      72.0        63.5           6         3     2.56
Conthey           75.5        85.9           3         2    99.71
Entremont         69.3        84.9           7         6    99.68
Herens            77.3        89.7           5         2   100.00
Martigwy          70.5        78.2          12         6    98.96
Monthey           79.4        64.9           7         3    98.22
Sierre            92.2        84.6           3         3    99.46
Val de Ruz        77.6        37.6          15         7     4.97
ValdeTravers      67.6        18.7          25         7     8.65
             Infant.Mortality
Franches-Mnt             20.2
Moutier                  20.3
Porrentruy               26.6
Broye                    23.6
Gruyere                  21.0
Veveyse                  24.5
Aubonne                  19.1
Cossonay                 18.7
Echallens                21.2
Moudon                   22.4
Orbe                     15.3
Oron                     21.0
Paysd'enhaut             18.0
Conthey                  15.1
Entremont                19.8
Herens                   18.3
Martigwy                 19.4
Monthey                  20.2
Sierre                   16.3
Val de Ruz               20.0
ValdeTravers             19.5

Матрицы

Что такое матрица?

x <- 1:6
dim(x)
NULL

Что такое матрица?

x <- c(20:31)
m <- matrix(x, nrow = 3)
colnames(m) <- c('a', 'b', 'c', 'd')
rownames(m) <- c(1, 2, 3)
dim(m) # 2 строки и 3 столбца
[1] 3 4

Матрицы

  • Внешне похожи на таблицу

  • Вектор с атрибутом dim

  • Все элементы одного типа

  • Математические операции работают быстрее

Способы создания матрицы 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m2 <- matrix(1:6, nrow=2, ncol=3,byrow=T)
m2 
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
as.matrix(1:3) 
     [,1]
[1,]    1
[2,]    2
[3,]    3

Способы создания матрицы 🏠

v <- 1:6
dim(v) 
NULL
dim(v) = c(2,3) 
v 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
is.matrix(v)
[1] TRUE

Способы создания матрицы 🏠

a <- c(1,2,3)
b <- c(4,5,6) 
rbind(a,b) 
  [,1] [,2] [,3]
a    1    2    3
b    4    5    6
cbind(a,b) 
     a b
[1,] 1 4
[2,] 2 5
[3,] 3 6

Матрицы: cрезы 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m1[2,3] # взять элемент на пересечении 2 строки и 3 столбца 
[1] 6
m1[2,] # взять вторую строку 
[1] 2 4 6
m1[,3] # взять третий столбец 
[1] 5 6
m1[,3, drop = F] # взять третий столбец в виде матрицы 
     [,1]
[1,]    5
[2,]    6

Матрицы: изменение значений 🏠

m1 <- matrix(1:6, nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
m1[2,3] = 9 
m1
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    9

Матрицы: создать пустую матрицу 🏠

m1 <- matrix(nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]   NA   NA   NA
[2,]   NA   NA   NA

Матрицы 🏠

m1 <- matrix(1:6,nrow=2, ncol=3)
m1 
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6
rownames(m1)
NULL
colnames(m1)
NULL
rownames(m1) = c('r1','r2')
colnames(m1) = c('c1','c2','c3') 
m1 
   c1 c2 c3
r1  1  3  5
r2  2  4  6

Имена строк и столбцов должны быть уникальными!

Имена элементов вектора

a <- c('f', 'g', 'h') # создаем неименованный вектор
a
[1] "f" "g" "h"
b <- c(a = 'f', b = 'g', c = 'h') # сразу создаем именованный вектор
b
  a   b   c 
"f" "g" "h" 

Имена элементов вектора

x <- 1:3 
x 
[1] 1 2 3
names(x)
NULL
names(x) <- c('a', 'b', 'c') 
x 
a b c 
1 2 3 
names(x) 
[1] "a" "b" "c"

Оформление решений

Демонстрация решений

Задание №1

Создайте вектор а из чисел 1, 5 и 8. Добавьте к каждому числу единицу. Положите результат в вектор b.

Хорошо:

Иванов Иван

15 мартобря 2025 - R - ФББ МГУ

Проверочная работа №315

Задание №1

Создайте вектор а из чисел 1, 5 и 8. Добавьте к каждому числу единицу. Положите результат в вектор b.

a <- c(1, 5, 8) # создаем вектор
a # показываем, что вектор создан и лежит в переменной a
[1] 1 5 8
b <- a + 1 # прибавляем к значениям вектора а единицу
b # показываем, как выглядит вектор b
[1] 2 6 9

Плохо:

a <- c(1, 5, 8)
b <- a + 1

Вопрос

Задание: прочитайте таблицу, отберите из нее 1000 строк

Как продемонстрировать корректность вашего решения?

Не проверяем

  • неопознанные файлы: фамилия, номер и тип задания должны быть в названии файла И в “шапке” документа

  • неполное содержание файла:

    • нет номера задания

    • нет формулировок и номеров заданий

    • нет демонстрации решения (!!!)

  • решения, присланные после дедлайнов

Штрафы

  • за оформление: нет структуры файла (заголовки)

  • некорректная демонстрация решения

  • неверное или неполное решение

  • неоптимальное решение

Проверяйте, что итоговый файл сгенерился правильно и его можно прочитать

Списывание

При обнаружении списывания задание обнуляется всем участникам, не разбираясь

Начисляются дополнительные штрафы

Конец!