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

task
Author

Elena U

Published

March 2, 2023

Можно проверить свое решение и сравнить с моим.

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

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

Калькулятор

  • Разделите числа 2583, 5971, 2946, 5783 на 7
2583 / 7
[1] 369
5971 / 7
[1] 853
2946 / 7
[1] 420.8571
5783 / 7
[1] 826.1429
  • Посчитайте остаток от деления этих же чисел на 7.
2583 %% 7
[1] 0
5971 %% 7
[1] 0
2946 %% 7
[1] 6
5783 %% 7
[1] 1
  • А целую часть от деления (числа те же)?
    Подсказка: справку по арифметическим операторам можно вызвать, набрав например ?`+` в консоли или просто погуглить: оператор целочисленного деления R
2583 %/% 7
[1] 369
5971 %/% 7
[1] 853
2946 %/% 7
[1] 420
5783 %/% 7
[1] 826
  • Посчитайте квадратный корень из числа 289 двумя разными способами
sqrt(289)
[1] 17
289 ^ 0.5
[1] 17
  • Посчитайте логарифм по основанию 7 от числа 96889010407
log(96889010407, 7)
[1] 13
  • Теперь натуральный логарифм от числа 10, результат умножить на 6
log(10) * 6
[1] 13.81551

Работа с векторами

  • Создайте вектор из чисел 5, 203, 11
c(5, 203, 11)
[1]   5 203  11
  • Создайте вектор из чисел от 314 до 335
314:335
 [1] 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
[20] 333 334 335
  • Создайте вектор чисел от 20 до 2. Подсказка: оператор : работает и для создания последовательностей с шагом -1/
20:2
 [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2
  • Создайте вектор чисел от 20 до 2 с шагом -2.
seq(20, 2, -2)
 [1] 20 18 16 14 12 10  8  6  4  2
  • Создайте вектор, состоящий из двадцати единиц

    rep(1, 20)
     [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  • Создайте вектор 1 1 1 2 2 2 3 3 3. Подсказка: чтобы узнать как это можно сделать, посмотрите справку функции rep()

    rep(1:3, each = 3)
    [1] 1 1 1 2 2 2 3 3 3
  • А теперь вектор 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 (если что непонятно - смотрим справку и гуглим)

    rep(1:3, each = 2, times = 3)
     [1] 1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3

Логические операторы

  • Проверьте на равенство: остаток от деления 257 на 6 и число 5
5 == 257 %% 6
[1] TRUE
  • Проверьте на равенство число 2 и квадратный корень из 2 в квадрате.
    Ответ убил:

    2 == sqrt(2) ^ 2
    [1] FALSE
    2 == sqrt(2) ^ 2

    Почему это произошло, можно почитать здесь. Такой прикол существует не только в R, а характерен для любого языка программирования, поскольку дробные числа в компьютере хранятся с ограниченной (хоть и достаточно большой) точностью. Для проверки на равенство такого рода можно использовать функцию all.equal().

    all.equal(2, sqrt(2) ^ 2)
    [1] TRUE
    Note

    Все дело в том, что числа в компьютере записываются в виде степеней двойки.

  • Сколько чисел, делящихся на 3 без остатка, в векторе чисел от 1 до 80?

    sum(1:80 %% 3 == 0)
    [1] 26

Индексация векторов

  • Создайте вектор x, состоящий из чисел с 2 до 20 с шагом 2. Извлеките 2, 5, 7 элемент
x <- seq(2, 20, 2)
x[c(2, 5, 7)]
[1]  4 10 14
  • Создайте вектор x, состоящий из чисел с 2 до 20 с шагом 2. Извлеките каждый третий элемент.

    x <- seq(2, 20, 2)
    x[seq(3, length(x), 3)]
    [1]  6 12 18
  • Индесация по условию. Извлеките все числа, кратные 9, в векторе чисел от 1 до 100.

    x <- 1:100
    x[x %% 9 == 0]
     [1]  9 18 27 36 45 54 63 72 81 90 99
  • Извлеките все числа, больше или равные нулю в векторе -4 -2 0 2 4

    x <- seq(-4, 4, 2)
    x[x >= 0]
    [1] 0 2 4

Приведение типов

  • Какой будет тип у вектора c(TRUE, 2, 'gene')? И почему?
    Ответ: character vector, поскольку этот тип является наиболее общим у приведенных элементов вектора

  • Вспомните, в каком порядке должно идти приведение типов.
    Ответ: logical > integer > numeric > character

  • Какими функциями можно превратить вектор в нужный тип?
    Ответ: например, as.integer(). В общем случае as.<нужный_тип>

Пропущенные значения

  • Уберите пропущенные значения из вектора
    missed_values <- c(NA, 1:3, NA, 7, 10, NA, NA, NA, 8, 5, 7)

    missed_values <- c(NA, 1:3, NA, 7, 10, NA, NA, NA, 8, 5, 7)
    missed_values[!is.na(missed_values)]
    [1]  1  2  3  7 10  8  5  7
  • Посчитайте среднее в этом векторе двумя разными способами

    mean(missed_values[!is.na(missed_values)])
    [1] 5.375
    mean(missed_values, na.rm = TRUE)
    [1] 5.375
  • Почему при сравнении NA == NA получается NA?
    Ответ: Мы не можем сделать вывод, равно ли одно неизвестное другому неизвестному

  • Чем плохи пропущенные значения?
    Ответ: Мешают вычислять описательные статистики, невозможно делать сравнения ==, <, >, некоторые функции просто не работают с пропущенными значениями.