Решения заданий по второй лекции

task
Author

Elena U

Published

March 7, 2023

Составлены в формате задание - ответ к нему.

Рассчитано на самопроверку: ваша задача написать такой код, чтобы совпал с моим правильным ответом. Плюс есть еще несколько заданий на подумать и вспомнить материал лекции.

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

Если вдруг найдутся ошибки/опечатки, пишите на почту e.ubogoeva@alumni.nsu.ru или в телеграм. Вопросы по заданиям также можно писать на почту или в телеграм, телеграм чуть предпочтительнее.

Матрицы

  • Создайте матрицу A, состоящую из единиц и имеющую 4 колонки и 4 строки:

    A <- matrix(1, 4, 4)
    A
         [,1] [,2] [,3] [,4]
    [1,]    1    1    1    1
    [2,]    1    1    1    1
    [3,]    1    1    1    1
    [4,]    1    1    1    1
  • Замените третью строку матрицы A на числа 5, 6, 7, 8

    A[3, ] <- c(5, 6, 7, 8)
    A
         [,1] [,2] [,3] [,4]
    [1,]    1    1    1    1
    [2,]    1    1    1    1
    [3,]    5    6    7    8
    [4,]    1    1    1    1
  • Извлеките четвертую колонку этой матрицы

    A[, 4]
    [1] 1 1 8 1
  • Создайте матрицу M из чисел от 21 до 40 размером 4 строки и 5 столбцов.

    M <- matrix(21:40, nrow = 4, ncol = 5)
    M
         [,1] [,2] [,3] [,4] [,5]
    [1,]   21   25   29   33   37
    [2,]   22   26   30   34   38
    [3,]   23   27   31   35   39
    [4,]   24   28   32   36   40
  • Замените в матрице M четные значения словом “Четное”, а нечетные словом “Нечетное”.

    ifelse(M %% 2 == 0, 'Четное', 'Нечетное')
         [,1]       [,2]       [,3]       [,4]       [,5]      
    [1,] "Нечетное" "Нечетное" "Нечетное" "Нечетное" "Нечетное"
    [2,] "Четное"   "Четное"   "Четное"   "Четное"   "Четное"  
    [3,] "Нечетное" "Нечетное" "Нечетное" "Нечетное" "Нечетное"
    [4,] "Четное"   "Четное"   "Четное"   "Четное"   "Четное"  

Списки

  • Создайте список list1, первый элемент: числовой вектор от 11 до 77 с шагом 3, второй элемент: буквы строчные английского алфавита - это встроенный набор letters, третий элемент: вектор TRUE, FALSE.

    list1 <- list(seq(11, 77, 3), letters, c(TRUE, FALSE))
    list1
    [[1]]
     [1] 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77
    
    [[2]]
     [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
    [20] "t" "u" "v" "w" "x" "y" "z"
    
    [[3]]
    [1]  TRUE FALSE
  • Извлеките второй элемент списка в виде вектора

    list1[[2]]
     [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
    [20] "t" "u" "v" "w" "x" "y" "z"
  • Извлеките четвертый элемент вектора первого элемента списка

    list1[[1]][4]
    [1] 20
  • Создайте новый элемент в списке, назовите его double_vector и заполните его первым элементом списка, умноженного на 2

    list1$double_vector <- list1[[1]] * 2
    list1
    [[1]]
     [1] 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77
    
    [[2]]
     [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
    [20] "t" "u" "v" "w" "x" "y" "z"
    
    [[3]]
    [1]  TRUE FALSE
    
    $double_vector
     [1]  22  28  34  40  46  52  58  64  70  76  82  88  94 100 106 112 118 124 130
    [20] 136 142 148 154
  • Извлеките элемент double_vector двумя разными способами

    list1$double_vector
     [1]  22  28  34  40  46  52  58  64  70  76  82  88  94 100 106 112 118 124 130
    [20] 136 142 148 154
    list1[['double_vector']]
     [1]  22  28  34  40  46  52  58  64  70  76  82  88  94 100 106 112 118 124 130
    [20] 136 142 148 154
  • Извлеките 1, 3, 5, 7 элементы вектора double_vector

    list1$double_vector[c(1, 3, 5, 7)]
    [1] 22 34 46 58
  • Замените пятый элемент double_vector на 100. Правила такие же как при замене элементов векторов

    list1$double_vector[5] <- 100
    list1
    [[1]]
     [1] 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77
    
    [[2]]
     [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
    [20] "t" "u" "v" "w" "x" "y" "z"
    
    [[3]]
    [1]  TRUE FALSE
    
    $double_vector
     [1]  22  28  34  40 100  52  58  64  70  76  82  88  94 100 106 112 118 124 130
    [20] 136 142 148 154
  • Создайте отдельный список small_list из первого и третьего элемента списка list1.

    small_list <- list1[c(1, 3)]
    small_list
    [[1]]
     [1] 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77
    
    [[2]]
    [1]  TRUE FALSE
  • Составьте список list2, состоящий из заглавных букв английского алфавита (LETTERS) номером 10, 15, 10, 15.

    list2 <- LETTERS[c(10, 15, 10, 15)]
    list2
    [1] "J" "O" "J" "O"
  • Объедините list1 и list2 в список list_whole, проверьте тип данных, выведите структуру.

    list_whole <- list(list1, list2)
    class(list_whole)
    [1] "list"
    str(list_whole)
    List of 2
     $ :List of 4
      ..$              : num [1:23] 11 14 17 20 23 26 29 32 35 38 ...
      ..$              : chr [1:26] "a" "b" "c" "d" ...
      ..$              : logi [1:2] TRUE FALSE
      ..$ double_vector: num [1:23] 22 28 34 40 100 52 58 64 70 76 ...
     $ : chr [1:4] "J" "O" "J" "O"

Датафреймы

  • Создадим датафрейм df, первая колонка: числа 10, 12, 15, вторая колонка вектор TRUE, FALSE, TRUE, третья колонка любой строковый вектор

    df <- data.frame(c(10, 12, 15), c(TRUE, FALSE, TRUE),
                     letters[1:3])
    df
      c.10..12..15. c.TRUE..FALSE..TRUE. letters.1.3.
    1            10                 TRUE            a
    2            12                FALSE            b
    3            15                 TRUE            c
  • Лучше создать с именами:

    df <- data.frame(values = c(10, 12, 15), logi = c(TRUE, FALSE, TRUE), character = letters[1:3])
    df
      values  logi character
    1     10  TRUE         a
    2     12 FALSE         b
    3     15  TRUE         c
  • Также для переименования можно использовать функцию colnames()

    colnames(df) <- c('name1', 'name2', 'name3')
    df
      name1 name2 name3
    1    10  TRUE     a
    2    12 FALSE     b
    3    15  TRUE     c
  • Извлеките 1, 2, 3 строки 5, 6, 9 колонки датасета mtcars (встроен в R, достаточно набрать mtcars).

    mtcars[1:3, c(5, 6, 9)]
                  drat    wt am
    Mazda RX4     3.90 2.620  1
    Mazda RX4 Wag 3.90 2.875  1
    Datsun 710    3.85 2.320  1

Установка пакетов

  • Установите пакет ggplot2 (пакет с CRAN-а для графиков)

    install.packages("ggplot2")
  • Загрузите пакет ggplot2

    library(ggplot2)
  • Задание со звездочкой (на способность гуглить): удалите (unload) пакет ggplot2 из окружения. Это редко, но иногда может понадобиться, при загрузке ненужного пакета. Однако, я рекомендую перезапустить RStudio комбинацией клавиш Ctrl+Shift+F10, и после этого загрузить уже только нужные пакеты.

    detach(package:ggplot2)

Условия

  • Извлечь случайное число из набора 0.00015, 0.6, 0.056, 0.02, если число < 0.05, вывести в консоль “p-value < 0.05”, иначе вывести “p-value не значимо”.

    value <- sample(c(0.00015, 0.6, 0.02, 0.056), 1)
    if (value < 0.05) {
      print('p-value < 0.05')
    } else {
      print("p-value не значимо")
    }
    [1] "p-value не значимо"
Tip

Напоминаю, что для извлечения случайных чисел используется функция sample()

Циклы

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

Векторизация

  • Создайте вектор p, состоящий из значений 4, 5, 6, 7, и вектор q, состоящий из 0, 1, 2, 3.

    p <- c(4, 5, 6, 7)
    q <- c(0, 1, 2, 3)
    p
    [1] 4 5 6 7
    q
    [1] 0 1 2 3
  • Посчитайте поэлементную сумму векторов p и q:

    p + q
    [1]  4  6  8 10
  • Посчитайте поэлементную разницу p и q:

    p - q
    [1] 4 4 4 4
  • Поделите каждый элемент вектора p на соответствующий ему элемент вектора q:

    p / q
    [1]      Inf 5.000000 3.000000 2.333333
  • Создайте вектор, в котором будут содержаться первые 20 степеней двойки.

    2 ^ (1:20)
     [1]       2       4       8      16      32      64     128     256     512
    [10]    1024    2048    4096    8192   16384   32768   65536  131072  262144
    [19]  524288 1048576
  • Посчитайте сумму чисел, кратных 3 ИЛИ кратных 5 в наборе чисел от 1 до 100

    x <- 1:100
    sum(x[x %% 3 == 0 | x %% 5 == 0])
    [1] 2418
  • Найдите сумму всех простых чисел от 1 до 100, где 1 не является простым. Если не получается решить задание сейчас, лучше подождать следующей лекции, разберем более подробно векторизацию и работу с функциями семейства *apply() и создание собственных функций.

    is_prime <- function(x) {
      if (x == 1) return(FALSE)
      if (x == 2) return(2)
      if (sum(x %% 2:(x-1) == 0) == 0) return(x) else return(FALSE)
    }
    sum(sapply(1:100, is_prime))
    [1] 1060