Семинар 1: ввод и вывод, векторы

Часть 1: ввод и вывод

Задача 1

Напишите код, который запрашивает у пользователя его имя с клавиатуры и выводит на экран сообщение вида “Hello, name!”.

name <- readline(prompt = "Enter your name: ")

# вариант 1
cat("Hello, ", name, "!", sep = "")  

# вариант 2
cat(sprintf("Hello, %s!", name))  

Задача 2

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

  • пользователь вводит дробные числа с десятичным разделителем в виде точки;
  • пользователь вводит дробные числа с десятичным разделителем в виде запятой.
# точки
x1 <- as.numeric(readline("Enter a number: ")) 
x2 <- as.numeric(readline("Enter a number: ")) 
cat(x1 + x2)
# запятые
a_str <- gsub(",", ".", 
              readline("Enter a number: "))
a <- as.numeric(a_str) 
b_str <- gsub(",", ".", 
              readline("Enter a number: "))
b <- as.numeric(b_str) 
cat(a + b)

Задача 3

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

vel <- as.numeric(readline("Enter km/h:"))
cat(vel / 3.6)

Часть 2: векторы

Задача 1

Дан вектор g, в котором хранятся следующие значения:

1, 0, 2, 3, 6, 8, 12, 15, 0, NA, NA, 9, 4, 16, 2, 0

Создайте вектор g. Используя R, выведите на экран:

  • первый элемент вектора;
  • последний элемент вектора;
  • элементы вектора с третьего по пятый включительно;
  • элементы вектора, которые равны 2;
  • элементы вектора, которые больше 4;
  • элементы вектора, которые кратны 3 (делятся на 3 без остатка);
  • элементы вектора, которые больше 4 и кратны 3;
  • элементы вектора, которые или меньше 1, или больше 5;
  • индексы элементов, которые равны 0;
  • индексы элементов, которые не меньше 2 и не больше 8.
g <- c(1, 0, 2, 3, 6, 8, 12, 15, 0, NA, NA, 9, 4, 16, 2, 0)

# 1
g[1]  

# 2
g[length(g)]

# 3
g[3:5]  

# 4
g[g == 2] 

# 5
g[g > 4] 

# 6
g[g %% 3 == 0] 

# 7
g[g < 1 | g > 5] 

# 8
which(g == 0) 

# 9
which(g >= 2 & g <= 8) 

# 10
which((! g < 2) & (! g > 8)) 

Задача 2

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

test <- c(6, 7, 3, 2, 7)
test[length(test)] <- NA
test

Задача 3

Напишите код, который выводит на экран индексы пропущенных значений в векторе.

which(is.na(test))

Задача 4

Напишите код, который считает, сколько пропущенных значений в векторе.

sum(is.na(test))

Задача 5

Напишите код, который позволяет создать вектор из id (уникальных номеров) респондентов, если известно, что в опросе участвовало 100 респондентов.

1:100

Задача 6

Решение задачи предполагает рациональное решение с помощью функций R, не нужно создавать вектора перечислением большого числа элементов вручную.

Известно, что в таблице хранятся показатели по 3 странам за 5 лет (см. ниже).

Создайте вектор который мог бы послужить столбцом country в этой таблице. Создайте вектор, который мог бы послужить столбцом year в этой таблице.

Таблица выглядит так:

country year
1 France 2000
2 France 2001
3 France 2002
4 France 2003
5 France 2004
6 Italy 2000
7 Italy 2001
8 Italy 2002
9 Italy 2003
10 Italy 2004
11 Spain 2000
12 Spain 2001
13 Spain 2002
14 Spain 2003
15 Spain 2004
country <- rep(c("France", "Italy", "Spain"), each = 5)
year <- rep(2000:2004, 3)

# плюс, объединим эти векторы в таблицу
dat <- cbind.data.frame(country, year)

Задача 7

Исследователь решил создать вектор income, в котором сохранены доходы нескольких респондентов:

income <- c(10000, 32000, 28000, 150000, 65000, 1573)

Исследователю нужно получить вектор income_class, состоящий из 0 и 1: 0 ставится, если доход респондента ниже среднего дохода, а 1 — если больше или равен среднему доходу. Создайте вектор income_class.

Подсказка: сначала можно посчитать среднее значение по вектору income и сохранить его в какую-нибудь переменную. Пользоваться встроенной функцией mean() нельзя.

income <- c(10000, 32000, 28000, 150000, 65000, 1573)
m <- sum(income) / length(income)

income_class <- as.integer(income >= m)
income_class

В решении выше мы превратили логический вектор из TRUE и FALSE, который вернулся нам в результате проверки income >= m в вектор целых чисел. При желании могли бы воспользоваться функцией ifelse():

# перечисляем: условие, значение в случае TRUE, 
# значение в случае FALSE
ifelse(income >= m, 1, 0)